修改view 的位置 可以使用
View.setY() 直接指定y的位置 ,y是view的左上角點(diǎn)的位置
ViewCompat.offsetTopAndBottom(view,offset),移動(dòng)距離。 view:要移動(dòng)的view,offset 在Y軸的偏移量deltaY
View.setY() 內(nèi)部是使用setTranslationY()來實(shí)現(xiàn)的,
public void setY(float y) {
setTranslationY(y - mTop);
}
簡(jiǎn)單解釋就是 計(jì)算目的Y位置 與 當(dāng)前top 的偏移量, 然后用setTranslationY()來移動(dòng)
所以setY() 和 setTranslationY() 不會(huì)改變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();
}
}
很明顯。直接對(duì)mTop進(jìn)行了修改,所以View.getTop()值會(huì)變化