美文网首页
关于View位移相关的简单笔记

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

作者: Straw_Hat | 来源:发表于2019-04-12 12:42 被阅读0次

    修改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位移相关的简单笔记

          本文链接:https://www.haomeiwen.com/subject/enzqwqtx.html