1. 程式人生 > >Android 手勢監聽demo

Android 手勢監聽demo

package com.shengfang.demo.testdemo;

import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

/**
 * 實現監聽上下左右滑動的事件,哪個view需要的時候直接setOnTouchListener就可以用了
 *
 */
public class GestureListener extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
    /** 左右滑動的最短距離 */
    private int distance = 100;
    /** 左右滑動的最大速度 */
    private int velocity = 200;

    private GestureDetector gestureDetector;

    public GestureListener(Context context) {
        super();
        gestureDetector = new GestureDetector(context, this);
    }

    /**
     * 向左滑的時候呼叫的方法,子類應該重寫
     * @return
     */
    public boolean left(float distance) {
        return false;
    }

    /**
            * 向右滑的時候呼叫的方法,子類應該重寫
     * @return
             */
    public boolean right(float distance) {
        return false;
    }
    /**
     * 向上滑的時候呼叫的方法,子類應該重寫
     * @return
     */
    public boolean up(float distance) {
        return false;
    }

    /**
     * 向下滑的時候呼叫的方法,子類應該重寫
     * @return
     */
    public boolean down(float distance) {
        return false;
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                           float velocityY) {
        // TODO Auto-generated method stub
        // e1:第1個ACTION_DOWN MotionEvent
        // e2:最後一個ACTION_MOVE MotionEvent
        // velocityX:X軸上的移動速度(畫素/秒)
        // velocityY:Y軸上的移動速度(畫素/秒)

        // 向左滑
        if (e1.getX() - e2.getX() > distance
                && Math.abs(velocityX) > velocity) {
            left(e1.getX() - e2.getX());
        }
        if (e1.getY() - e2.getY() > distance
                && Math.abs(velocityX) > velocity) {
           up(e1.getY() - e2.getY());
        }
        // 向右滑
        if (e2.getX() - e1.getX() > distance
                && Math.abs(velocityX) > velocity) {
            right(e2.getX() - e1.getX() );
        }
        if (e2.getY() - e1.getY() > distance
                && Math.abs(velocityX) > velocity) {
            down(e2.getY() - e1.getY());
        }
        return false;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        gestureDetector.onTouchEvent(event);
        return false;
    }

    public int getDistance() {
        return distance;
    }

    public void setDistance(int distance) {
        this.distance = distance;
    }

    public int getVelocity() {
        return velocity;
    }

    public void setVelocity(int velocity) {
        this.velocity = velocity;
    }

    public GestureDetector getGestureDetector() {
        return gestureDetector;
    }

    public void setGestureDetector(GestureDetector gestureDetector) {
        this.gestureDetector = gestureDetector;
    }
}

 

 

 

package com.shengfang.demo.testdemo;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
   private TextView hh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //需要監聽左右滑動事件的view
        RelativeLayout view = (RelativeLayout) this.findViewById(R.id.layout);
        hh=(TextView)findViewById(R.id.hh);
        //setLongClickable是必須的
        view.setLongClickable(true);
        view.setOnTouchListener(new MyGestureListener(this));
    }

    /**
     * 繼承GestureListener,重寫left和right方法
     */
    private class MyGestureListener extends GestureListener {
        public MyGestureListener(Context context) {
            super(context);
        }

        @Override
        public boolean left(float distance) {
            Log.e("test", "向左滑");
            hh.setText("向左滑"+distance);
            return super.left(distance);
        }

        @Override
        public boolean up(float distance) {
            hh.setText("向上滑"+distance);
            return super.up(distance);
        }

        @Override
        public boolean down(float distance) {
            hh.setText("向下滑"+distance);
            return super.down(distance);
        }

        @Override
        public boolean right(float distance) {
            Log.e("test", "向右滑");
            hh.setText("向右滑"+distance);
            return super.right(distance);
        }
    }

}