Android View 中的scrollBy() scrollTo() getScrollY() getScrollX()

android系统以手机屏幕左上角为坐标原点建立直角坐标系,x轴方向与笛卡尔坐标系相同,y轴方向与笛卡尔坐标系相反,

获取控件在parent中的相对位置可以使用getLeft(),getRight(),getTop(),getBottom()这四个方法,此处不详解,

查看View中源码,在这个类中有mScrollX和mScrollY两个变量用于存储控件移动的位移,而getScrollY和getScrollX返回的即是相对应的mScrollX以及mScrollY,所以,getScrollX以及getScrollY获取的是移动事件的位移。(即为控件左上角当前相对于屏幕左上角为坐标原点的坐标x和y)

View中scrollTo()代码如下

    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();
            }
        }
    }
可以看到scrollTo最终调用的是onScrollChanged()方法,此方法是控制滑动的,此处不细究,有兴趣可以去深究,那么,由此可以看到scrollTo方法是将控件移动到相对于屏幕左上角坐标原点的x、y位置。
scrollBy的代码如下:

public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }
scrollBy封装了scrollTo方法,移动的是与当前位置的相对坐标。


另,在MotionEvent中,event.getX()获取的是当前位置相对于控件左上角为坐标原点的坐标值,event.getRawX()则是当前位置相对于屏幕左上角为坐标原点的值

最后 附图一张
Android View 中的scrollBy() scrollTo() getScrollY() getScrollX()_第1张图片



你可能感兴趣的:(android)