去寫一個自定義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);
}