本文主要是介绍Carson带你学Android:手把手教你学会手势识别应用 GestureDetector,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
- 手势识别在
Android
开发的应用非常常见 - 今天
carson
将详细给大家讲解Android
手势识别类:GestureDetector
类的使用。(含实例讲解)
Carson带你学Android系列文章
Carson带你学Android:学习方法
Carson带你学Android:四大组件
Carson带你学Android:自定义View
Carson带你学Android:异步-多线程
Carson带你学Android:性能优化
Carson带你学Android:动画
目录
简介
下面,我将结合实例,详细介绍GestureDetector的使用接口 & 使用类。
接口1:OnGestureListener
1. 作用
检测用户在屏幕的以下操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动
2. 使用步骤
// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)
// 构造函数有3个,常用的是第二个
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {// 1. 用户轻触触摸屏public boolean onDown(MotionEvent e) {Log.i("MyGesture", "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;}});// 步骤2-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应View.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return true; // 注:返回true才能完整接收触摸事件}});// 步骤2-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件super.dispatchTouchEvent(ev); // 让Activity响应触碰事件return false;}
3. 实例说明
现在对一个TextView进行手势检测
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="600dp"android:text="carson_ho Test"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {TextView mTextView;GestureDetector mGestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {// 1. 用户轻触触摸屏public boolean onDown(MotionEvent e) {Log.i("MyGesture", "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;}});// 步骤2:让TextView检测手势:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应mTextView = (TextView) findViewById(R.id.textView);mTextView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return false;}});}
}
4. 示意图
我在屏幕作出一系列手势进行测试
接口2:OnDoubleTapListener
1. 作用
检测用户单击、双击屏幕
2. 使用步骤
// 步骤1:创建手势检测器实例// 注:使用OnDoubleTapListener接口时,需要使用GestureDetector,而GestureDetector的创建则必须传入OnGestureListener接口// 所以在使用OnDoubleTapListener接口时,也必须实现OnGestureListener接口// 构造函数有3个,常用的是第二个// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {// 1. 用户轻触触摸屏public boolean onDown(MotionEvent e) {Log.i("MyGesture", "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;}});// 步骤2:创建 & 设置OnDoubleTapListener接口实现类mGestureDetector.setOnDoubleTapListener(new GestureDetector.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;}});// 步骤3-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应View.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return true; // 注:返回true才能完整接收触摸事件}});// 步骤3-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件super.dispatchTouchEvent(ev); // 让Activity响应触碰事件return false;}
3. 实例说明
现在对一个TextView进行手势检测
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="600dp"android:text="carson_ho Test"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {TextView mTextView;GestureDetector mGestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法)mGestureDetector = new GestureDetector(this, new GestureDetector.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;}});// 步骤2:创建 & 设置OnDoubleTapListener接口实现类mGestureDetector.setOnDoubleTapListener(new GestureDetector.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;}});// 步骤3:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应mTextView = (TextView) findViewById(R.id.textView);mTextView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return true;}});}
}
4. 测试效果
日志效果如下
使用类:SimpleOnGestureListener
1. 作用
集成了两个接口的手势检测功能
2. 与上述两个接口的区别
- OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
- 而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已
3. 使用步骤
// 步骤1:创建手势检测器实例// 构造函数有3个,此处用的是第三个// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);GestureDetector 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-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应View.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return true; // 注:返回true才能完整接收触摸事件}});// 步骤2-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件super.dispatchTouchEvent(ev); // 让Activity响应触碰事件return false;}
4. 实例说明
现在对一个TextView进行手势检测
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="600dp"android:text="carson_ho Test"android:textAppearance="?android:attr/textAppearanceLarge" /></LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {TextView mTextView;GestureDetector mGestureDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 步骤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() {@Overridepublic boolean onTouch(View v, MotionEvent event) {mGestureDetector.onTouchEvent(event);return true;}});}
}
5. 测试效果
日志效果如下
至此,关于Android手势识别类GestureDetector类使用讲解完毕。
总结
- 本文主要对
Android
手势识别类:GestureDetector
类的使用进行全面讲解 - Carson带你学Android系列文章
Carson带你学Android:学习方法
Carson带你学Android:四大组件
Carson带你学Android:自定义View
Carson带你学Android:异步-多线程
Carson带你学Android:性能优化
Carson带你学Android:动画
欢迎关注Carson_Ho的CSDN博客 与 公众号!
博客链接:https://carsonho.blog.csdn.net/
请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!
这篇关于Carson带你学Android:手把手教你学会手势识别应用 GestureDetector的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!