Android 手势识别GestureDetector

接口1:OnGestureListener

检测用户在屏幕的以下操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动

接口2:OnDoubleTapListener

检测用户单击、双击屏幕

使用类:SimpleOnGestureListener

1. 作用

集成了两个接口的手势检测功能

2. 与上述两个接口的区别

  • OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
  • 而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已

使用示例: 

import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class GesturedetectorActivity extends AppCompatActivity {

    TextView mTextView;
    GestureDetector mGestureDetector;

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

        // 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)
        mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

            // OnGestureListener接口的函数
            // 1. 用户轻触触摸屏
            public boolean onDown(MotionEvent e) {
                Log.i("MyGesture1", "onDown");
                return false;
            }

            // 2. 用户轻触触摸屏,尚未松开或拖动
            // 与onDown()的区别:无松开 / 拖动
            // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行
            public void onShowPress(MotionEvent e) {
                Log.i("MyGesture", "onShowPress");
            }

            // 3. 用户长按触摸屏
            public void onLongPress(MotionEvent e) {
                Log.i("MyGesture", "onLongPress");
            }

            // 4. 用户轻击屏幕后抬起
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapUp");
                return true;
            }

            // 5. 用户按下触摸屏 & 拖动
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                Log.i("MyGesture", "onScroll:");
                return true;
            }

            // 6. 用户按下触摸屏、快速移动后松开
            // 参数:
            // e1:第1个ACTION_DOWN MotionEvent
            // e2:最后一个ACTION_MOVE MotionEvent
            // velocityX:X轴上的移动速度,像素/秒
            // velocityY:Y轴上的移动速度,像素/秒
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                   float velocityY) {
                Log.i("MyGesture", "onFling");
                return true;
            }

            // OnDoubleTapListener的函数
            // 1. 单击事件
            // 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别
            // onSingleTapConfirmed:再次点击(即双击),则不会执行
            // onSingleTapUp:手抬起就会执行
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapConfirmed");
                return false;
            }

            // 2. 双击事件
            public boolean onDoubleTap(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTap");
                return false;
            }

            // 3. 双击间隔中发生的动作
            // 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件;
            public boolean onDoubleTapEvent(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTapEvent");
                return false;
            }
        });

        // 步骤2:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应
        mTextView = (TextView) findViewById(R.id.textView);
        mTextView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGestureDetector.onTouchEvent(event);
                return true;
            }
        });
    }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="点击屏幕即可实验"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

项目地址:https://github.com/buder-cp/base_component_learn/blob/master/multiAdapt/someuitest/src/main/java/com/zhy/someuitest/GesturedetectorActivity.java

参考Android 手势识别应用:手把手教你学会 GestureDetector(含实例讲解) - 云+社区 - 腾讯云 

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/125395312