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

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat