Android开发-手势识别

使用OnTouchListener进行手势识别

下面是实例代码

ImageView img;
        //对ImageView绑定触摸监听
        img.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction())
                {
                    case MotionEvent.ACTION_DOWN:
                        Toast.makeText(OnTouchActivity.this, "按下", Toast.LENGTH_SHORT).show();
                        break;
                    case MotionEvent.ACTION_UP:
                        Toast.makeText(OnTouchActivity.this, "抬起", Toast.LENGTH_SHORT).show();
                        break;
                }
                return true;
            }
        });

通过参数motionEvent可以获得当前的活动(motionEvent.getAction()方法)

查看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;取消

...

将当前活动与MotionEvent类中的常量进行比较,便可以知道当前的触摸方式了

除了使用getAction方法来判断当前活动的触摸方式外,还可以通过其他方法来实现更多的手势识别

例如使用getX()方法或getY()方法来获取坐标,并实现识别手指向左向右向上向下滑动的识别功能

示例如下:

img.setOnTouchListener(new View.OnTouchListener() {
            float X1 = 0;
            float X2 = 0;
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction()==MotionEvent.ACTION_DOWN)
                {
                    X1 = motionEvent.getX();
                }
                else if (motionEvent.getAction()==MotionEvent.ACTION_UP)
                {
                    X2 = motionEvent.getX();
                    if (X1 - X2 > 60)
                    {
                        Toast.makeText(getApplicationContext(), "正在向左滑动", Toast.LENGTH_SHORT).show();
                    }
                    else if (X1 - X2 < -60)
                    {
                        Toast.makeText(getApplicationContext(), "正在向右滑动", Toast.LENGTH_SHORT).show();
                    }
                }
                return true;
            }
        });

相对而言,直接使用OnTouch来识别手势比较简单,但如果用来处理一些相对复杂的手势时就比较麻烦了

使用OnGestureListener进行手势识别

使用这个类能够识别我们更多的手势,GestureDetector.OnGestureListener接口中带有这么几个方法


    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return true;
        //按下时调用
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {
        //按下后未移动未松开时调用
    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return true;
        //按下后抬起时调用
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return true;
        //滚动时调用,鼠标滚轮滚动也能触发
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {
        //长按时调用
    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return true;
        //滑动时调用
    }

其中

onScroll滚动方法,由一个MotionEvent.ACTION_DOWN以及多个MotionEvent.ACTION_MOVE触发

onFling滑动方法由两个MotionEvent触发,参数解释如下:

MotionEvent motionEvent :第一个按下的触摸,即滑动时手指第一次按下时触发

MotionEvent motionEvent1:第二个MotionEvent参数,为手指滑动后抬起时触发,即滑动完成抬起手指时

float v:X轴上的移动速度,像素/秒

float v1:Y轴上的移动速度,像素/秒

下面是使用OnGestureListener手势识别的实例

一:定义一个类实现OnGestureListener接口,并重写其中的方法

public class MyOnTouch implements GestureDetector.OnGestureListener{

    Context context;
    public MyOnTouch(Context context){
        this.context = context;
    }

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        Toast.makeText(context, "onDown", Toast.LENGTH_SHORT).show();
        return true;
        //按下时调用
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {
        Toast.makeText(context, "onShowPress", Toast.LENGTH_SHORT).show();
        //按下后未移动未松开时调用
    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        Toast.makeText(context, "onSingleTapUp", Toast.LENGTH_SHORT).show();
        return true;
        //按下后抬起时调用
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        Toast.makeText(context, "onScroll", Toast.LENGTH_SHORT).show();
        return true;
        //滚动时调用,鼠标滚轮滚动也能触发
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {
        //长按时调用
    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        Toast.makeText(context, "onFling", Toast.LENGTH_SHORT).show();
        return true;
        //滑动时调用
    }
}

二:定义一个GestureDetectorCompat对象并传入参数(应用上下文、以及一个OnGestureListener接口,这里传入我们重写过的类)下面是完整的代码

public class OnTouchActivity extends Activity{

    //定义一个GestureDetectorCompat对象
    GestureDetectorCompat gestureDetectorCompat;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_on_touch);
        setListener();
    }

    public void setListener()
    {
        //为ImageView绑定触摸监听器
        img.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //返回的事件处理为gestureDetectorCompat的事件处理
                return gestureDetectorCompat.onTouchEvent(motionEvent);
            }
        });
    }
}

*在触发触摸方法时,如果想要触摸方法继续判断执行,需要在执行的方法中return结果true,否则将不再执行

猜你喜欢

转载自blog.csdn.net/weixin_39885435/article/details/82667414