美文网首页
View#scrollBy(int x , int y)反向

View#scrollBy(int x , int y)反向

作者: HWilliamgo | 来源:发表于2018-07-27 16:58 被阅读22次

    先看下源码

    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }
    
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }
    

    了解了scrollBy( x , y)就是在原来的基础上,改mScrollX为x,改为mScrollY为Y。

    比如调用view#scrollBy(100 , 50)后,mScrollX增加了100,mScrollY增加了50。但是这个view的内容却往反方向移动了,就是往左边移动100 ,上边移动50。

    而mScrollX和mScrollY的定义:

    mScrollX = View的内容左边框的x坐标值 - 实际的View左边缘的x坐标。

    mScrollY = View的内容上边框的的y坐标值 - 实际的View上边缘的y坐标。

    而View的内容左边框的x坐标值和View的内容上边框的y坐标值在用View#scrollToView#scrollBy是不会改变的。

    因此当调用scrollBy(int x , int y)中的参数都填入正值时,

    mScrollX = View的内容左边框的x坐标值 - 实际的View左边缘的x坐标。
    

    由等式性质得:实际的View的左边缘的x坐标,减少。

    即scrollBy(x, y )的x>0时,view会往左跑。这就是scrollBy(int x , int y)反向的原因。

    那么要让view的内容往右下方走的话,就要为scrollBy传入负值。比如:

    相关文章

      网友评论

          本文标题:View#scrollBy(int x , int y)反向

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