

1.View靜態(tài)坐標(biāo)
| View坐標(biāo) | 參數(shù)含義 |
|---|---|
| Left = getLeft(); | View自身左側(cè)到父View左側(cè)的距離 |
| Top = getTop(); | View自身頂部到父View頂部的距離 |
| Right = getRight(); | View自身右側(cè)到父View左側(cè)的距離 |
| Bottom = getBottom(); | View自身底部到父View頂部的距離 |
| getTranslationX() | View左上角相對(duì)父View的X軸偏移量 |
| getTranslationY() | View左上角相對(duì)父View的Y軸偏移量 |
| getX() | 值為getLeft()+getTranslationX(),當(dāng)setTranslationX()時(shí)getLeft()不變,getX()變。 |
| getY() | 值為getTop()+getTranslationY(),當(dāng)setTranslationY()時(shí)getTop()不變,getY()變。 |
MotionEvent觸摸事件坐標(biāo)、
| MotionEvent坐標(biāo)方法 | 參數(shù)含義 |
|---|---|
| getX() | 當(dāng)前觸摸點(diǎn)距離當(dāng)前View自身左邊的距離 |
| getY() | 當(dāng)前觸摸點(diǎn)距離當(dāng)前View自身頂部的距離 |
| getRawX() | 當(dāng)前觸摸點(diǎn)距離屏幕左邊的距離(Android絕對(duì)坐標(biāo)系) |
| getRawY() | 當(dāng)前觸摸點(diǎn)距離屏幕頂部的距離(Android絕對(duì)坐標(biāo)系) |
2.View中的滑動(dòng)坐標(biāo)系

| View滑動(dòng)坐標(biāo) | 參數(shù)含義 |
|---|---|
| offsetLeftAndRight(int offset) | 水平方向挪動(dòng)View,offset為正則x軸正向移動(dòng),移動(dòng)的是整個(gè)View,getLeft()會(huì)變的,自定義View很有用。 |
| offsetTopAndBottom(int offset) | 垂直方向挪動(dòng)View,offset為正則y軸正向移動(dòng),移動(dòng)的是整個(gè)View,getTop()會(huì)變的,自定義View很有用。 |
| scrollTo(int x, int y) | 將View中內(nèi)容(不是整個(gè)View)滑動(dòng)到相應(yīng)的位置,參考坐標(biāo)原點(diǎn)為ParentView左上角,x,y為正則向xy軸反方向移動(dòng),反之同理。 |
| scrollBy(int x, int y) | 在scrollTo()的基礎(chǔ)上繼續(xù)滑動(dòng)xy。 |
| setScrollX(int value) | 實(shí)質(zhì)為scrollTo(),只是改變X軸滑動(dòng)。 |
| setScrollY(int value) | 實(shí)質(zhì)為scrollTo(),只是改變Y軸滑動(dòng)。 |
| getScrollX()/getScrollY() | 獲取當(dāng)前滑動(dòng)位置偏移量。分別對(duì)應(yīng)著mScrollX、mScrollY。mScrollX的值總是等于View左邊緣和View內(nèi)容左邊緣在水平方向的距離,mScrollY的值總是等于View的上邊緣和View內(nèi)容上邊緣在豎直方向的距離。View邊緣指View的位置,有四個(gè)頂點(diǎn)組成,Left、Top、Right、Bottom。所以該值的參考坐標(biāo)系是父View的左上角。 |
mScrollX = getLeft()-mContentDistanceX;
mScrollY = getTop()-mContentDistanceY;
(mContentDistanceX和mContentDistanceY分別是View的內(nèi)容在X軸、Y軸滑動(dòng)的距離)
mScrollX和mScrollY的單位為像素,并且當(dāng)View左邊緣(getLeft())在View內(nèi)容左邊緣的右邊時(shí),mScrollX為正值,反之為負(fù)值;當(dāng)View上邊緣(getTop())在View內(nèi)容上邊緣的下邊時(shí),mScrollY為正值,反之為負(fù)值。
同理,調(diào)用View的scrollBy()和scrollTo()方法時(shí)參數(shù)傳遞正數(shù),卻想坐標(biāo)系負(fù)方向移動(dòng)。
源碼分析:
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();
}
}
}
View的該方法注釋里明確說明了調(diào)運(yùn)他會(huì)觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過程,draw()過程中最終其實(shí)會(huì)觸發(fā)下面的invalidate()方法,如下:
public void invalidate(int l, int t, int r, int b) {
final int scrollX = mScrollX;
final int scrollY = mScrollY; //scroller時(shí)為何參數(shù)和坐標(biāo)反向的真實(shí)原因
invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
}
invalidate()的四個(gè)參數(shù)分別是View的Left、Top、Right和Bottom,代碼中mScrollX和mScrollY。l-scrollX,當(dāng)scrollX為負(fù)時(shí),l-scrollx > l,此時(shí)View內(nèi)容的左邊緣在view左邊緣的右側(cè),同理說明scrollX、scrollY傳負(fù)值時(shí),View的內(nèi)容往坐標(biāo)系正值方向移動(dòng)。