getX,getY,getScrollX,getScrollY,ScrollTo(),ScrollBy()辨析

前言:前兩天看了自定義控件,其中有一些東西我以爲有必要深刻理解一下
如下圖爲例:
post

getX(),getY()返回的是觸摸點A相對於view的位置
getRaw(),getRawY()返回的是觸摸點B相對於phone(屏幕)的位置。3d

scrollTo是將View中的內容移動到指定的座標x,y處,此x,y是相對於View的左上角來講,而不上屏幕的左上角。
當ScrollTo(-30,50)時,它從正中心移動到了右上方code

可能有些人對此有疑問,按照慣性思惟,view中的內容應該是移動到左上方的,咱們點進去,看源碼是怎麼實現的?blog

protected int mScrollX;//視圖內容相對於視圖起始座標X軸方向的偏移量
 protected int mScrollY;//視圖內容相對於視圖起始座標Y軸方向的偏移量
  public final int getScrollX() {
        return mScrollX;
    }
 public final int getScrollY() {
        return mScrollY;
    }

 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();
            }
        }
    }
//onScrollChanged()中的方法實現
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        notifySubtreeAccessibilityStateChangedIfNeeded();

        if (AccessibilityManager.getInstance(mContext).isEnabled()) {
            postSendViewScrolledAccessibilityEventCallback(l - oldl, t - oldt);//偏移量-傳入座標參數
        }
    }

首先咱們要確立一點View的起始座標(0,0)在View的左上角位置。
經過源碼咱們能夠隨便代入一下例如假設mScrollX=100,mScrollY=100,
當調用ScrollTo(-30,50)時,
l-oldl=100-(-30)=130,t-oldt=100-50=50,
因此它實際移動到的位置是(130,50)
,如今是否是明白了上圖中view內容爲何往上右上方移動了get

接下來咱們再看看getScrollX()和getScrollY(),額,咱們驚喜的發現——這兩個方法的源碼在上面
它們的返回值是mScrollX和mScrollY.
scrollTo和scrollBy
scrollTo(x,y):相對於初始位置的移動,此x,y是相對於View的左上角
scrollBy(x,y):相對於上次移動的最後位置移動,改變的是View中的相對位置,參數x,y爲距離上一次的相對位置
二者移動的都是view的內容,view自己是不移動的。
嘿嘿!perfect源碼

相關文章
相關標籤/搜索