View的各種座標

去寫一個自定義View的時候,你會發現,View的各種座標有點分不清了。這篇博文就來理清下這些座標吧。

一、圖解

這裏寫圖片描述
(1).getLeft(),當前View的左邊緣與它父View的左邊緣的距離(視圖座標);
(2).getRight(),當前View的右邊緣與它父View的左邊緣的距離(視圖座標);
(3).getTop(),當前View的上邊緣與它父View的上邊緣(頂部)的距離(視圖座標);
(4).getBottom(),當前View的下邊緣與它父View的上邊緣(頂部)的距離(視圖座標);
(5).getWidth(),獲取當前View的寬度;
(6).getHeight(),獲取當前View的高度;
(7).getX(),觸摸中心點與該View左邊緣的距離(視圖座標);
(8).getY(),觸摸中心點與該View上邊緣(頂部)的距離(視圖座標);
(9).getRawX(),觸摸中心點與屏幕左邊緣的距離(絕對座標);
(10).getRawY(),觸摸中心點與屏幕上邊緣(頂部)的距離(絕對座標);

二、View 的 getY(), getTranslationY() 和 getTop() 之間的聯繫

@ViewDebug.ExportedProperty(category = "drawing")
public float getY() {
   return mTop + getTranslationY();
}

    @ViewDebug.ExportedProperty(category = "drawing")
    public float getTranslationY() {
        return mRenderNode.getTranslationY();
    }
    @ViewDebug.CapturedViewProperty
    public final int getTop() {
        return mTop;
    }

從以上的源碼我們可以知道 getY()= getTranslationY()+ getTop (),而 getTranslationY() 的默認值是0,除非我們通過 setTranlationY() 來改變它,這也就是我們上面上到的 getY 默認值跟 getTop()相同

三、View 的 getScroolY 和 View 的 scrollTo() 和 scrollBy()

getScrollY是一個比較特別的函數,因爲它涉及一個值叫mScrollY,簡單說,getScrollY一般得到的都是0,除非你調用過scrollTo或scrollBy這兩個函數來改變它。

scrollTo() 和 scrollBy()

從字面意思我們可以知道 scrollTo() 是滑動到哪裏的意思 ,scrollBy()是相對當前的位置滑動了多少。當然這一點在源碼中也是可以體現出來的

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();
        }
    }
}
public void scrollBy(int x, int y) {
    scrollTo(mScrollX + x, mScrollY + y);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章