Android滑動效果是如何產生的

jayriver 8年前發布 | 16K 次閱讀 Android Android開發 移動開發

前言

相對于Android2.X版本中常見的長按、點擊操作,滑動的操作方式具有更好的用戶體驗性。因此,從Android4.X版本開始,滑動操作就大量出現在了Android系統中,各種第三方應用也競相模仿這種效果,來改善自己的應用,下面就將向大家展示如何在應用中添加滑動效果。
滑動一個View,本質上來說就是移動一個View。改變其當前所處的位置,它的原理與動畫效果的實現非常相似,都是通過不斷地改變View的坐標來實現這一效果。所以,要實現View的滑動,就必須監聽用戶觸摸的事件,并根據事件傳入的坐標,動態且不斷地改變View的坐標,從而實現View跟隨用戶觸摸的滑動而滑動。
在講解如何實現滑動效果之前,需要先來了解一下Android中的窗口坐標體系和屏幕的觸控事件——MotionEvent。

Android坐標系

在物理學中,要描述一個物體的運動,就必須選定一個參考系。所謂滑動,正是相對于參考系的運動。在Android中,將屏幕最左上角的頂點作為Android坐標系的原點,從這個點向右是X軸正方向,從這個點向下是Y軸的正方向,如下圖所示。

滑動效果是如何產生的(Android群英傳)

Android坐標系


系統提供了getLocationOnScreen(int location[])這樣的方法來獲取Android坐標系中點的位置,即該視圖左上角在Android坐標系的坐標。另外,在觸控事件中使用getRawX()、getRawY()方法所獲得的坐標同樣是Android坐標系中的坐標。

視圖坐標系

Android中除了上面所說的這種坐標系之外,還有一個視圖坐標系,它描述了子視圖在父視圖中的位置關系。這兩種坐標系并不矛盾也不復雜,他們的作用是相輔相成的。與Android坐標系類似,視圖坐標系同樣是以原點向右為X軸正方向,以原點向下為Y軸正方向,只不過在視圖坐標系中,原點不再是Android坐標系中的屏幕最左上角,而是以父視圖左上角為坐標原點,如下圖所示。

滑動效果是如何產生的(Android群英傳)

視圖坐標系


在觸控事件中,通過getX()、getY()所獲得的坐標就是視圖坐標系中的坐標。

觸控事件——MotionEvent

觸控事件MotionEvent在用戶交互中,站著舉足輕重的地位,學好觸控事件是掌握后序內容的基礎。首先,來看看MotionEvent中封裝的一些常用的事件常量,它定義了觸控事件的不同類型。

// 單點觸摸按下動作
public static final int ACTION_DOWN             = 0;
// 單點觸摸離開動作
public static final int ACTION_UP               = 1;
// 觸摸點移動動作
public static final int ACTION_MOVE             = 2;
// 觸摸動作取消
public static final int ACTION_CANCEL           = 3;
// 觸摸動作超出邊界
public static final int ACTION_OUTSIDE          = 4;
// 多點觸摸按下動作
public static final int ACTION_POINTER_DOWN     = 5;
// 多點離開動作
public static final int ACTION_POINTER_UP       = 6;

通常情況下,我們會在onTouchEvent(MotionEvent event)方法中通過event.getAction()方法來獲取觸控事件的類型,并使用switch-case方法來進行篩選,這個代碼的模式基本固定,如下所示。

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 獲取當前輸入點的X、Y坐標(視圖坐標)
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 處理輸入的按下事件
            break;
        case MotionEvent.ACTION_MOVE:
            // 處理輸入的移動事件
            break;
        case MotionEvent.ACTION_UP:
            // 處理輸入的離開事件
            break;
    }
    return true;
}

在不涉及多點操作的情況下,通常可以使用以上代碼來完成觸控事件的監聽,不過這里只是一個代碼模板,后面我們會在觸控事件中完成具體的邏輯。
在Android中,系統提供了非常多的方法來獲取坐標值、相對距離等。方法豐富固然好,但也給初學者帶來了很多困惑,不知道在什么情況下使用什么方法,下面總結了一些API,結合Android坐標系來看看該如何使用它們,如下圖所示。

滑動效果是如何產生的(Android群英傳)

獲取坐標值的各種方法


這些方法可以分成如下兩個類別:

  • View提供的獲取坐標方法

    getTop():獲取到的是View自身的頂邊到其父布局頂邊的距離。
    getLeft():獲取到的是View自身的左邊到其父布局左邊的距離。
    getRight():獲取到的是View自身的右邊到其父布局左邊的距離。
    getBottom():獲取到的是View自身的底邊到其父布局頂邊的距離。

  • MotionEvent提供的方法

    getX():獲取點擊事件距離控件左邊的距離,即視圖坐標。
    getY():獲取點擊事件距離控件頂邊的距離,即視圖坐標。
    getRawX():獲取點擊事件距離整個屏幕左邊的距離,即絕對坐標。
    getRawY():獲取點擊事件距離整個屏幕頂邊的距離,即絕對坐標。
相信通過上圖,讀者們應該對MotionEvent和Android坐標系有了一個比較清楚的認識。

 

來自:http://blankj.com/857.html
 

 

 本文由用戶 jayriver 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!