Android中的GestureDetector(手势)详细区分介绍

2024-02-09 07:58

本文主要是介绍Android中的GestureDetector(手势)详细区分介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android为了手势检测提供了GestureDetector手势识别类。GestureDetector类代表一个手势检测器,创建GestureDetector时需要传人一个GestureDetector.OnGestureListener实例,GestureDetector.OnGestureListener就是一个监听器,负责对用户的手势行为提供响应。

如果GestureDetector.SimpleOnGestureListener消耗掉了这个事件,则返回true,否则返回false
当然最后不要忘记在你的Activity中override onTouch方法来获取手势action:

GestureDetector detector;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.show);//创建手势检测器detector = new GestureDetector(this,this);
}//将该Activity上的触碰时间交给GestureDetector处理
@Override  
public boolean onTouchEvent(MotionEvent event) {   if (detector.onTouchEvent(event))   return true;   else  return false;   
}



boolean  onDoubleTap(MotionEvent e) 
解释:双击的第二下Touch down时触发 
boolean  onDoubleTapEvent(MotionEvent e) 
解释:双击的第二下Touch down和up都会触发,可用e.getAction()区分。 
boolean  onDown(MotionEvent e) 
解释:当触碰时间按下时触发该方法
boolean onSingleTapUp(MotionEvent e)
解释:用户在触摸屏上的轻击时间将会触发方法 
boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
解释:Touch了滑动一点距离后,up时触发。其中velcoityX、velcoityY代表“滑动”动作在横向、纵向上的速度,e1为down时的MotionEvent,e2为up时的MotionEvent。
void  onLongPress(MotionEvent e) 
解释:Touch了不移动一直Touch down时触发 
boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
解释:Touch了滑动时触发,其中e1为down时的MotionEvent,e2为move时的MotionEvent
void  onShowPress(MotionEvent e) 
解释:Touch了还没有滑动或松开时触发 


与onDown,onLongPress比较 onDown只要Touch down一定立刻触发。 

而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。 

所以Touchdown后一直不滑动,onDown->onShowPress->onLongPress这个顺序触发。
boolean  onSingleTapConfirmed(MotionEvent e) 
boolean  onSingleTapUp(MotionEvent e) 
解释:上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup: 
onDown->onSingleTapUp->onSingleTapConfirmed 
点击一下稍微慢点的(不滑动)Touchup: 

onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed


一个小Demo详细介绍:

布局只有一个简单的TextView(id=show)

package com.example.gesturedemo;import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.TextView;
import android.widget.Toast;
/*1. 点击屏幕上的某项的执行流程  有两种情况,一种是时间很短,一种时间稍长
时间很短:onDown--------》onSingleTapUp--------》onSingleTapConfirmed
时间稍长:onDown--------》onShowPress------》onSingleTapUp--------》onSingleTapConfirmed
2. 长按事件
onDown--------》onShowPress------》onLongPress
3.抛:手指触动屏幕后,稍微滑动后立即松开
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
4.拖动
onDown------》onScroll----》onScroll------》onFiling
注意:有的时候会触发onFiling,但是有的时候不会触发,个人理解是人的动作不标准所致。*/
public class MainActivity extends Activity implements OnGestureListener {GestureDetector detector;TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.show);detector = new GestureDetector(this,this);}@Overridepublic boolean onTouchEvent(MotionEvent me){return detector.onTouchEvent(me);}// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发    //Touch down时触发,不论是touch (包括long) ,scroll@Overridepublic boolean onDown(MotionEvent arg0) {// TODO Auto-generated method stubtextView.setText("onDown");return false;}/*  * 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE,  * 1个ACTION_UP触发(non-Javadoc)  * Fling事件的处理代码:除了第一个触发Fling的ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外 * ,我们还可以根据用户在X轴或者Y轴上的移动速度作为条件  * 比如下面的代码中我们就在用户移动超过100个像素,且X轴上每秒的移动速度大于200像素时才进行处理。  *   * @see Android.view.GestureDetector.OnGestureListener#onFling(android.view.  * MotionEvent, Android.view.MotionEvent, float, float)  * 这个例子中,tv.setLongClickable( true )是必须的,因为  * 只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN)  * ,我们同样可以通过layout定义中的Android:longClickable来做到这一点  */@Overridepublic boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// 参数解释:    // e1:第1个ACTION_DOWN MotionEvent    // e2:最后一个ACTION_MOVE MotionEvent    // velocityX:X轴上的移动速度,像素/秒    // velocityY:Y轴上的移动速度,像素/秒    // 触发条件 :    // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒 // TODO Auto-generated method stubtextView.setText("onFling\n" + String.valueOf(arg2) + "\n" + String.valueOf(arg3) + "\n");return false;}// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发 //Touch了不移动一直Touch down时触发//Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。@Overridepublic void onLongPress(MotionEvent arg0) {// TODO Auto-generated method stubtextView.setText("onLangPress");}// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发    @Overridepublic boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {// TODO Auto-generated method stubtextView.setText("onScroll\n" + String.valueOf(arg2) +"\n" + String.valueOf(arg3) + "\n");return false;}/*  * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发  * 注意和onDown()的区别,强调的是没有松开或者拖动的状态 (单击没有松开或者移动时候就触发此事件,再触发onLongPress事件)  */   //Touch了还没有滑动时触发//(与onDown,onLongPress比较//onDown只要Touch down一定立刻触发。@Overridepublic void onShowPress(MotionEvent arg0) {// TODO Auto-generated method stubtextView.setText("onShowPress");}// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发@Overridepublic boolean onSingleTapUp(MotionEvent arg0) {// TODO Auto-generated method stubtextView.setText("onSingleTapUp");return false;}
}


这篇关于Android中的GestureDetector(手势)详细区分介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693620

相关文章

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4