修改view 的位置 可以使用
View.setY() 直接指定y的位置 ,y是view的左上角点的位置
ViewCompat.offsetTopAndBottom(view,offset),移动距离。 view:要移动的view,offset 在Y轴的偏移量deltaY
View.setY() 内部是使用setTranslationY()来实现的,
public void setY(float y) {
setTranslationY(y - mTop);
}
简单解释就是 计算目的Y位置 与 当前top 的偏移量, 然后用setTranslationY()来移动
所以setY() 和 setTranslationY() 不会改变view.mTop的值,改变的只是view 视觉上的位置
看一下 ViewCompat.offsetTopAndBottom(view,offset) 的源码
/**
* Offset this view's vertical location by the specified number of pixels.
*
* @param offset the number of pixels to offset the view by
*/
public void offsetTopAndBottom(int offset) {
if (offset != 0) {
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
} else {
final ViewParent p = mParent;
if (p != null && mAttachInfo != null) {
final Rect r = mAttachInfo.mTmpInvalRect;
int minTop;
int maxBottom;
int yLoc;
if (offset < 0) {
minTop = mTop + offset;
maxBottom = mBottom;
yLoc = offset;
} else {
minTop = mTop;
maxBottom = mBottom + offset;
yLoc = 0;
}
r.set(0, yLoc, mRight - mLeft, maxBottom - minTop);
p.invalidateChild(this, r);
}
}
} else {
invalidateViewProperty(false, false);
}
mTop += offset;
mBottom += offset;
mRenderNode.offsetTopAndBottom(offset);
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
invalidateParentIfNeededAndWasQuickRejected();
} else {
if (!matrixIsIdentity) {
invalidateViewProperty(false, true);
}
invalidateParentIfNeeded();
}
notifySubtreeAccessibilityStateChangedIfNeeded();
}
}
很明显。直接对mTop进行了修改,所以View.getTop()值会变化
网友评论