View坐標(biāo)系

1-1View坐標(biāo)系

1-2父View移出屏幕后子View的getLeft()值

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)系

Paste_Image.png
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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容