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左上角相對父View的X軸偏移量 |
getTranslationY() | View左上角相對父View的Y軸偏移量 |
getX() | 值為getLeft()+getTranslationX()球拦,當(dāng)setTranslationX()時getLeft()不變拄轻,getX()變。 |
getY() | 值為getTop()+getTranslationY(),當(dāng)setTranslationY()時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絕對坐標(biāo)系) |
getRawY() | 當(dāng)前觸摸點(diǎn)距離屏幕頂部的距離(Android絕對坐標(biāo)系) |
2.View中的滑動坐標(biāo)系
View滑動坐標(biāo) | 參數(shù)含義 |
---|---|
offsetLeftAndRight(int offset) | 水平方向挪動View灵奖,offset為正則x軸正向移動嚼沿,移動的是整個View,getLeft()會變的瓷患,自定義View很有用骡尽。 |
offsetTopAndBottom(int offset) | 垂直方向挪動View,offset為正則y軸正向移動擅编,移動的是整個View攀细,getTop()會變的,自定義View很有用爱态。 |
scrollTo(int x, int y) | 將View中內(nèi)容(不是整個View)滑動到相應(yīng)的位置辨图,參考坐標(biāo)原點(diǎn)為ParentView左上角,x肢藐,y為正則向xy軸反方向移動故河,反之同理。 |
scrollBy(int x, int y) | 在scrollTo()的基礎(chǔ)上繼續(xù)滑動xy吆豹。 |
setScrollX(int value) | 實(shí)質(zhì)為scrollTo()鱼的,只是改變X軸滑動。 |
setScrollY(int value) | 實(shí)質(zhì)為scrollTo()痘煤,只是改變Y軸滑動凑阶。 |
getScrollX()/getScrollY() | 獲取當(dāng)前滑動位置偏移量。分別對應(yīng)著mScrollX衷快、mScrollY宙橱。mScrollX的值總是等于View左邊緣和View內(nèi)容左邊緣在水平方向的距離,mScrollY的值總是等于View的上邊緣和View內(nèi)容上邊緣在豎直方向的距離蘸拔。View邊緣指View的位置师郑,有四個頂點(diǎn)組成,Left调窍、Top宝冕、Right、Bottom邓萨。所以該值的參考坐標(biāo)系是父View的左上角地梨。 |
mScrollX = getLeft()-mContentDistanceX;
mScrollY = getTop()-mContentDistanceY;
(mContentDistanceX和mContentDistanceY分別是View的內(nèi)容在X軸菊卷、Y軸滑動的距離)
mScrollX和mScrollY的單位為像素,并且當(dāng)View左邊緣(getLeft())在View內(nèi)容左邊緣的右邊時宝剖,mScrollX為正值洁闰,反之為負(fù)值;當(dāng)View上邊緣(getTop())在View內(nèi)容上邊緣的下邊時万细,mScrollY為正值扑眉,反之為負(fù)值。
同理雅镊,調(diào)用View的scrollBy()和scrollTo()方法時參數(shù)傳遞正數(shù)襟雷,卻想坐標(biāo)系負(fù)方向移動。
源碼分析:
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)他會觸發(fā)onScrollChanged()和invalidated()方法仁烹,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過程耸弄,draw()過程中最終其實(shí)會觸發(fā)下面的invalidate()方法,如下:
public void invalidate(int l, int t, int r, int b) {
final int scrollX = mScrollX;
final int scrollY = mScrollY; //scroller時為何參數(shù)和坐標(biāo)反向的真實(shí)原因
invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
}
invalidate()的四個參數(shù)分別是View的Left卓缰、Top计呈、Right和Bottom,代碼中mScrollX和mScrollY征唬。l-scrollX捌显,當(dāng)scrollX為負(fù)時,l-scrollx > l,此時View內(nèi)容的左邊緣在view左邊緣的右側(cè)总寒,同理說明scrollX扶歪、scrollY傳負(fù)值時,View的內(nèi)容往坐標(biāo)系正值方向移動摄闸。