关于View位移相关的简单笔记

修改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()值会变化

你可能感兴趣的:(关于View位移相关的简单笔记)