android 中View測量,佈局和滑動的屬性區分

getRawX():獲得當前view的當前位置相對於手機窗體的水平座標

getX():獲得當前view的當前位置相對於他的父容器的水平座標

getLeft():獲得當前view初始位置的左邊界相對於他的父容器左邊界的水平偏移量

getScrollX():獲得當前view的左邊界相對於自身的內容的左邊界的偏移量,可以爲負值

getTranslationX():獲得當前view的上一個位置相對於它的初始位置的水平偏移量


代碼區分:


private int lastX;
private int lastY;

@Override
public boolean onTouchEvent(MotionEvent event) {

    //move時不斷獲取絕對位置
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //只在第一次按下時將當前位置記錄爲起始
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

            //獲取移動前位置(即移動後的位置的上一個位置)和初始位置的偏移量
            int offsetX = (int) this.getTranslationX();
            int offsetY = (int) this.getTranslationY();

            //獲得移動後位置和移動前位置的偏移量
            int dX = x - lastX;
            int dY = y - lastY;

            //獲得總的偏移量並設置爲最終位置
            int tX = offsetX + dX;
            int tY = offsetY + dY;

            //移動到最終位置,是個moveBy()操作
            this.setTranslationX(tX);
            this.setTranslationY(tY);

            break;
        case MotionEvent.ACTION_UP:
            break;
    }

    //移動完畢,將當前位置記錄爲下次移動的起始位置
    lastX = x;
    lastY = y;
    return true;
}


既然要獲得總偏移量
 int tX = offsetX + dX;
),完全可以將lastX=x 刪掉,比如下面的寫法

@Override
public boolean onTouchEvent(MotionEvent event) {

    //move時不斷獲取絕對位置
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //在第一次按下時將當前位置記錄爲起始
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:

           //直接獲取當前位置相對於初始位置的總偏移量
            int dX = x - lastX;
            int dY = y - lastY;

        
            //移動到最終位置,是個moveBy()操作
            this.setTranslationX(dX);
            this.setTranslationY(dY);

            break;
        case MotionEvent.ACTION_UP:
            break;
    }

    return true;
}
這個時候滑動一次擡起手指,再次按下會回到起始位置,因爲這時lastX = x; dx =0,所以
this.setTranslationX(dX);這個moveBy()操作的參數就是0,就是相對於起始位置沒有移動,所以回到原位


發佈了44 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章