android 手勢檢測(左右滑動、上下滑動)

GestureDetector類可讓咱們快速的處理手勢事件,如點擊,滑動等。 
使用GestureDetector分三步: 
1. 定義GestureDetector類 
2. 初始化手勢類,同時設置手勢監聽 
3. 將touch事件交給gesture處理android

這裏總共重寫了六個函數,這些函數都在什麼狀況下才會觸發呢,下面講一下:app

OnDown(MotionEvent e):用戶按下屏幕就會觸發;
onShowPress(MotionEvent e):若是是按下的時間超過瞬間,並且在按下的時候沒有鬆開或者是拖動的,那麼onShowPress就會執行,具體這個瞬間是多久,我也不清楚呃……
onLongPress(MotionEvent e):長按觸摸屏,超過必定時長,就會觸發這個事件
    觸發順序:
    onDown->onShowPress->onLongPress
onSingleTapUp(MotionEvent e):從名子也能夠看出,一次單獨的輕擊擡起操做,也就是輕擊一下屏幕,馬上擡起來,纔會有這個觸發,固然,若是除了Down之外還有其它操做,那就再也不算是Single操做了,因此也就不會觸發這個事件
    觸發順序:
    點擊一下很是快的(不滑動)Touchup:
    onDown->onSingleTapUp->onSingleTapConfirmed 
    點擊一下稍微慢點的(不滑動)Touchup:
    onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用戶按下觸摸屏、快速移動後鬆開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發   
     參數解釋:
    e1:第1個ACTION_DOWN MotionEvent
    e2:最後一個ACTION_MOVE MotionEvent
    velocityX:X軸上的移動速度,像素/秒
    velocityY:Y軸上的移動速度,像素/秒   
onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖動事件。不管是用手拖動view,或者是以拋的動做滾動,都會屢次觸發,這個方法       在ACTION_MOVE動做發生時就會觸發
    滑屏:手指觸動屏幕後,稍微滑動後當即鬆開
    onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
    拖動
    onDown------》onScroll----》onScroll------》onFilingide

    可見,不管是滑屏,仍是拖動,影響的只是中間OnScroll觸發的數量多少而已,最終都會觸發onFling事件!函數

package com.guorentong.learn.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;

public class MainActivity extends AppCompatActivity {

    protected static final float FLIP_DISTANCE = 50;
    GestureDetector mDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                // TODO Auto-generated method stub

            }

            /**
             *
             * e1 The first down motion event that started the fling. e2 The
             * move motion event that triggered the current onFling.
             */
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if (e1.getX() - e2.getX() > FLIP_DISTANCE) {
                    Log.i("MYTAG", "向左滑...");

                    Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                    startActivity(intent);
                    return true;
                }
                if (e2.getX() - e1.getX() > FLIP_DISTANCE) {
                    Log.i("MYTAG", "向右滑...");
                    return true;
                }
                if (e1.getY() - e2.getY() > FLIP_DISTANCE) {
                    Log.i("MYTAG", "向上滑...");
                    return true;
                }
                if (e2.getY() - e1.getY() > FLIP_DISTANCE) {
                    Log.i("MYTAG", "向下滑...");
                    return true;
                }

                Log.d("TAG", e2.getX() + " " + e2.getY());

                return false;
            }

            @Override
            public boolean onDown(MotionEvent e) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mDetector.onTouchEvent(event);
    }
}
相關文章
相關標籤/搜索