Android的手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。

 

基础

GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。

GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。

OnGestureListener的接口有这几个:

 

// 单击,触摸屏按下时立刻触发 

abstract boolean onDown(MotionEvent e); 

// 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) 

abstract boolean onSingleTapUp(MotionEvent e); 

// 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 

abstract void onShowPress(MotionEvent e); 

// 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 

abstract void onLongPress(MotionEvent e); 

// 滚动,触摸屏按下后移动 

abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); 

// 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 

abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); 

OnDoubleTapListener的接口有这几个:

 

// 双击,手指在触摸屏上迅速点击第二下时触发 

abstract boolean onDoubleTap(MotionEvent e); 

// 双击的按下跟抬起各触发一次 

abstract boolean onDoubleTapEvent(MotionEvent e); 

// 单击确认,即很快的按下并抬起,但并不连续点击第二下 

abstract boolean onSingleTapConfirmed(MotionEvent e); 

 

有时候我们并不需要处理上面所有手势,方便起见,Android提供了另外一个类SimpleOnGestureListener实现了如上接口,我们只需要继承SimpleOnGestureListener然后重载感兴趣的手势即可。

 

应用

STEP 1: 创建手势侦听对象

 

 

package noodies.blog.youkuaiyun.com; 

 

import android.content.Context; 

import android.view.MotionEvent; 

import android.view.GestureDetector.SimpleOnGestureListener; 

import android.widget.Toast; 

 

public class MyGestureListener extends SimpleOnGestureListener { 

 

    private Context mContext; 

     

    MyGestureListener(Context context) { 

        mContext = context; 

    } 

     

    @Override 

    public boolean onDown(MotionEvent e) { 

        Toast.makeText(mContext, "DOWN " + e.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public void onShowPress(MotionEvent e) { 

        Toast.makeText(mContext, "SHOW " + e.getAction(), Toast.LENGTH_SHORT).show();            

    } 

 

    @Override 

    public boolean onSingleTapUp(MotionEvent e) { 

        Toast.makeText(mContext, "SINGLE UP " + e.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public boolean onScroll(MotionEvent e1, MotionEvent e2, 

            float distanceX, float distanceY) { 

        Toast.makeText(mContext, "SCROLL " + e2.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public void onLongPress(MotionEvent e) { 

        Toast.makeText(mContext, "LONG " + e.getAction(), Toast.LENGTH_SHORT).show(); 

    } 

 

    @Override 

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 

            float velocityY) { 

        Toast.makeText(mContext, "FLING " + e2.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public boolean onDoubleTap(MotionEvent e) { 

        Toast.makeText(mContext, "DOUBLE " + e.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public boolean onDoubleTapEvent(MotionEvent e) { 

        Toast.makeText(mContext, "DOUBLE EVENT " + e.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

 

    @Override 

    public boolean onSingleTapConfirmed(MotionEvent e) { 

        Toast.makeText(mContext, "SINGLE CONF " + e.getAction(), Toast.LENGTH_SHORT).show(); 

        return false; 

    } 

} 

 

 

 

STEP 2: 设置手势识别

 

 

 

我们可以在Activity里设置手势识别:

 

 

package noodies.blog.youkuaiyun.com; 

 

import android.app.Activity; 

import android.os.Bundle; 

import android.view.GestureDetector; 

import android.view.MotionEvent; 

 

public class GestureTestActivity extends Activity { 

    private GestureDetector mGestureDetector; 

 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

 

        mGestureDetector = new GestureDetector(this, new MyGestureListener(this)); 

    } 

 

    @Override 

    public boolean onTouchEvent(MotionEvent event) { 

        return mGestureDetector.onTouchEvent(event); 

    } 

} 

 

 

 

也可以在自定义的View里面设置手势识别:

 

 

package noodies.blog.youkuaiyun.com; 

 

import android.content.Context; 

import android.util.AttributeSet; 

import android.view.GestureDetector; 

import android.view.MotionEvent; 

import android.view.View; 

 

public class MyView extends View { 

 

    private GestureDetector mGestureDetector; 

 

    public MyView(Context context, AttributeSet attrs) { 

        super(context, attrs); 

 

        mGestureDetector = new GestureDetector(context, new MyGestureListener(context)); 

 

        setLongClickable(true); 

 

        this.setOnTouchListener(new OnTouchListener() { 

 

            public boolean onTouch(View v, MotionEvent event) { 

                return mGestureDetector.onTouchEvent(event); 

            } 

 

        }); 

    } 

} 

 

 

陷阱 

对于自定义View,使用手势识别有两处陷阱可能会浪费你的不少时间

1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势 

2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作

 

测试结果

下面是各种操作返回的手势序列,数值0表示触摸屏按下,1表示抬起

 

 

单击:down 0, single up 1, single conf 0 

短按:down 0, show 0, single up 1 

长按:down 0, show 0, long 0 

双击:down 0, single up 1, double 0, double event 0, down 0, double event 1 

滚动:down 0, (show 0), scrool 2... 

滑动:down 0, (show 0), scrool 2..., fling 1   

android中手势识别的实现 第一步:建立手势库 使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-8\GestureBuilder)。使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestu 阅读详情

相关推荐

Android手势识别基础介绍

如今的 Android 手机已经离不开手指与屏幕的交互了,基本上只要在使用手机就避免不了手势的识别,相信各位学习 Android 开发的朋友们大都与手势交互打过交道,我的这篇博客就是使用 GestureDetector 实现手势识别。1、MotionEvent如今在国内,按键手机已经是少之又少了,至少我身边的人用的都是触屏的机器,这也就说明我们手机程序开发者开发的应用应该都是围绕着触控来识别操作。拿

HardWorkingAnt的博客 2202

探秘Android手势事件机制与优化技巧

通过本文的介绍,我们了解了Android手势事件传递的原理,包括手势事件的类型、分发机制和处理流程等内容。同时,我们探讨了一些优化用户体验的技巧。通过应用这些技巧和方法,我们可以提高应用的用户体验,并让用户更加愉快地使用我们的应用。如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

xiaokangss的博客 550

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1236

理解Android的手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时

noodies的专栏 5123

从ADRV9002到ADRV9003:手把手教你移植FPGA驱动,避开那些官方没说的坑

本文详细介绍了从ADRV9002到ADRV9003的FPGA驱动移植实战指南,重点解析了两者在硬件架构上的关键差异,如通道配置和DPD功能的移除。通过提供完整的移植步骤、调试技巧和性能优化建议,帮助工程师避开官方文档未提及的常见陷阱,实现高效驱动开发。

weixin_28738397的博客 174

块坐标下降法实战:如何用Python一步步优化无人机通信网络?

本文通过Python实战案例,详细介绍了块坐标下降法在优化无人机通信网络中的应用。文章以最大化网络吞吐量为目标,将复杂的非凸问题拆解为功率分配和轨迹规划两个子问题,并提供了完整的算法实现、代码示例及调参指南,为机器学习工程师解决类似优化问题提供了实用参考。

sat99的博客 975

【转】android 手势识别和VelocityTracker

参考地址: http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1117/574.html 一.Android的手势操作识别 1.在android应用当中每一次手势的交互都都会依照如下顺序...

weixin_30662109的博客 138

试读源码在这里下载

试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4301

Android手势识别01——基本手势的处理

Android手势识别01基本手势的处理 一简介 二按下显示按下单击滚动长按快掷手势 1 activity_base_testxml 2 BaseTestActivityjava 3 图示 4 方法分析和说明 三双击手势 1 使用 GestureDetectorOnDoubleTapListener 2 使用 GestureDetectorSimpleOnGestureListener 3 图示 四

qiwenmingshiwo的专栏 2388

Multisim14.0仿真应用设计(三十九)74LS183 高速全加器应用仿真

74LS183是一种高速全加器,可以同时执行四位二进制数的加法运算。它的输入端包括两个4位二进制数和一个进位信号,输出端则为一个4位二进制数和一个进位信号。

zhusl6688的博客 3849

SAP_SD模块销售利润中心替代简介

SAP SD模块跨公司销售利润中心替代简介 在SAP SD模块中,系统自动生成的财务凭证需要正确反映利润中心归属。当默认利润中心取值不符合业务逻辑时(如跨公司销售、多组织共用工厂等情况),需配置利润中心替代功能。该功能通过事务码0KEM定义替代规则,可根据物料、客户等条件自动替换利润中心字段。系统配置包括创建替代规则、定义先决条件、设置用户出口程序等步骤。对于复杂业务场景,还可通过用户出口或BADI增强实现。利润中心替代能确保销售收入与成本正确核算,避免利润分配错误,满足企业多维度利润分析需求。

我小时候很黑的博客 433

android 简书 手势动画,20分钟学会Android全手势处理,你要的都有

以前都是迷茫过日子,沉迷游戏,也是被腾讯害了我的前半生。谁都有人生最灰暗的一段日子,索性后来被一耳光打醒,才开始懂得珍惜时间,才会觉得时间是最贵重的,得拼命地挤。我的github13年申请,前面是空白,最近就开始绿了,我相信坚持下去,会种出一片草坪。image.png走过路过千万不要错过,瞧一瞧看一看了,Android手势操作大甩卖。这里有按下,抬起,点击,长按,左滑,右滑,上滑,下滑,放大缩小,...

weixin_30950075的博客 610

【Qt图书管理系统】5.完整版源码及下载地址

Qt图书管理系统完整源码下载。

小鱼酱的博客 7001

android手势识别opencv,较为成熟的安卓项目--人面识别,手势识别向

一、 人脸识别1. 目标检测&目标追踪&人脸检测&人脸识别效果2. Android下使用OpenCV实现人脸检测效果3.人脸标识效果4. 人脸检测github:https://github.com/VernonVan/Face效果:主要实现人脸基本信息检测、趣味贴图、相似指数等功能效果5.基于Face++开发的一款人脸识别App,通过照片可以检测性别和年龄效果6.RxJav...

weixin_39956612的博客 527

YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用

本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法: 1️⃣ 加入。添加后如下:2️⃣:加入基于的。利用改进模块,减少通道冗余。改进代码如下:首先添加如下代码让加入,并重命名为 再添加如

Limiiiing的博客 3872

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android单目手势识别,单目手势识别及其在安卓平台的应用研究

摘要:目前,人机交互技术日益普及,已经被广泛应用于科研,生产,生活等领域.基于单目视觉的手势识别技术是人机交互的重要组成部分,该技术主要涉及手势的分割,特征的提取,手势的识别与跟踪等多个关键环节.但是手势识别在实际应用中容易受到光照变化,复杂背景的干扰,另外,考虑到交互实时性要求,算法的复杂度受到一定限制,这些都让单目动态手势识别技术成为人机交互领域中的难点.因此,本文提出低运算量的改进手势识别算...

weixin_35654096的博客 449

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

手势识别3:Android实现手部检测和手势识别(可实时运行,含Android源码)

开发一个Android手势识别,手势动作识别,手势数据集,手势识别APP,YOLO手势识别;APP在普通Android手机上可以达到实时的手势识别效果,CPU(4线程)约30ms左右,GPU约25ms左右 ,基本满足业务的性能需求

AI吃大瓜的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android 手势识别算法,基于安卓的视觉手势识别系统的制作方法

本发明属于Android平台技术领域。背景技术:手势是人类交流沟通中不可分割的一部分,视觉手势识别技术在最近几年也得到了一些应用,这一技术开辟了人机交互系统的新方向,因此对视觉手势的研究具有很大的现实意义。技术实现要素:系统处理流程设计:在系统的设计过程中,系统结构流程如下:首先,手机用户安装软件,打开软件之后进入主界面;然后会是缩略图界面,握拳向左向右移动来浏览大量图片;我们可以通过手势张开打开...

weixin_34297395的博客 743

android手势框架,安卓的手势识别框架

android2.2开始安卓中出现了ScaleGestureDetector。从此第一台多点触控的安卓手机出现了,不管是手机还是ScaleGestureDetector都非常了不起。但我疑惑不解的是,为什么ScaleGestureDetector是唯一一个多点触控手势识别api,为什么没有类似于旋转手势识别的api,识别两个手指(或者多个手指)配合而造成的旋转。难道是因为安卓和google之间的...

weixin_36024234的博客 499

android手势识别软件下载,安卓的手势识别框架

昨天介绍了一个手势处理的框架http://jcodecraeer.com/a/opensource/2015/0211/2465.html ,这个框架其实是将手势识别封装成了一个个的类,更好复用而已,其实是很久以前的项目了,但是其面向对象的思维还是值得学习的。下面是相关文章的翻译,翻译的不是很认真哈。从api android2.2开始安卓中出现了ScaleGestureDetector。从此第...

weixin_32042959的博客 218

基于MediaPipe的手势识别 --安卓部分

基于MediaPipe的手势识别 --安卓部分 mediapipe网址:可能会有点儿慢 https://google.github.io/mediapipe/solutions/hands.html#static_image_mode 简单介绍一下mediaPipe,他就是一个集成好的包括人脸关键位点识别、身体关键位点识别、手部关键位点识别的一个包或者库,直接调用就能够得到它的关键位点信息,以手部关键位点为例子: 通过检测人手部得到21个点的一个列表如下 [[x0,y0,z0],[x1,y1,z1],…

weixin_46124467的博客 5288

Android 手势识别

在Android应用中,很多地方都用到了手势识别技术,比如说手机屏幕j

寒岁青松的专栏 803

android手势识别

android手势识别 详细步骤不说了 手势识别代码    http://download.youkuaiyun.com/detail/zhupengqq/9578532 运行上边这个项目之后,会生成这样一个手势识别库gestures,新建一个项目, 在res下面,建立一个raw文件夹,然后引入这个库 下面是具体实例: <LinearLayout xmlns:android=

zhupengqq的博客 836

android 手势开发,Android开发之——手势识别

前言使用浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到了android.gesture包,具体的例子参考的是Sample中的GestureBuilder程序。手势识别的一般步骤手势创建手势创建主要用到了GestureOverlayView和GestureLibrary。GestrueOverlayView的父类...

weixin_35711852的博客 836

Android的手势操作识别

转自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html Android的手势操作识别 时间:2012-10-20 23:09 来源:未知 作者:admin 点击: 282 次 摘要 首先,在Android系统中,每一次手势交互都会依照以下顺序执行。 1. 接触接触屏一刹那,触发

comikey的专栏 3万+
上一篇: android中的category
下一篇: Android 动态设置全屏,退出全屏
biandroid
博客等级 码龄15年 3粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值