用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

小蜜锋    -  云代码空间

—— 技术宅拯救世界!

Android手势识别(单击 双击 抬起 短按 长按 滚动 滑动)

2012-12-21|9656阅||

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

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

  • 基础

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

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

OnGestureListener的接口有这几个:

  1. // 单击,触摸屏按下时立刻触发  
  2. abstract boolean onDown(MotionEvent e);  
  3. // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)  
  4. abstract boolean onSingleTapUp(MotionEvent e);  
  5. // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会  
  6. abstract void onShowPress(MotionEvent e);  
  7. // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发  
  8. abstract void onLongPress(MotionEvent e);  
  9. // 滚动,触摸屏按下后移动  
  10. abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);  
  11. // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势  
  12. abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);  

OnDoubleTapListener的接口有这几个:

  1. // 双击,手指在触摸屏上迅速点击第二下时触发  
  2. abstract boolean onDoubleTap(MotionEvent e);  
  3. // 双击的按下跟抬起各触发一次  
  4. abstract boolean onDoubleTapEvent(MotionEvent e);  
  5. // 单击确认,即很快的按下并抬起,但并不连续点击第二下  
  6. abstract boolean onSingleTapConfirmed(MotionEvent e);  


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

  • 应用

STEP 1: 创建手势侦听对象

  1. package noodies.blog.csdn.net;  
  2.   
  3. import android.content.Context;  
  4. import android.view.MotionEvent;  
  5. import android.view.GestureDetector.SimpleOnGestureListener;  
  6. import android.widget.Toast;  
  7.   
  8. public class MyGestureListener extends SimpleOnGestureListener {  
  9.   
  10.     private Context mContext;  
  11.       
  12.     MyGestureListener(Context context) {  
  13.         mContext = context;  
  14.     }  
  15.       
  16.     @Override  
  17.     public boolean onDown(MotionEvent e) {  
  18.         Toast.makeText(mContext, "DOWN " + e.getAction(), Toast.LENGTH_SHORT).show();  
  19.         return false;  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onShowPress(MotionEvent e) {  
  24.         Toast.makeText(mContext, "SHOW " + e.getAction(), Toast.LENGTH_SHORT).show();             
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean onSingleTapUp(MotionEvent e) {  
  29.         Toast.makeText(mContext, "SINGLE UP " + e.getAction(), Toast.LENGTH_SHORT).show();  
  30.         return false;  
  31.     }  
  32.   
  33.     @Override  
  34.     public boolean onScroll(MotionEvent e1, MotionEvent e2,  
  35.             float distanceX, float distanceY) {  
  36.         Toast.makeText(mContext, "SCROLL " + e2.getAction(), Toast.LENGTH_SHORT).show();  
  37.         return false;  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onLongPress(MotionEvent e) {  
  42.         Toast.makeText(mContext, "LONG " + e.getAction(), Toast.LENGTH_SHORT).show();  
  43.     }  
  44.   
  45.     @Override  
  46.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  47.             float velocityY) {  
  48.         Toast.makeText(mContext, "FLING " + e2.getAction(), Toast.LENGTH_SHORT).show();  
  49.         return false;  
  50.     }  
  51.   
  52.     @Override  
  53.     public boolean onDoubleTap(MotionEvent e) {  
  54.         Toast.makeText(mContext, "DOUBLE " + e.getAction(), Toast.LENGTH_SHORT).show();  
  55.         return false;  
  56.     }  
  57.   
  58.     @Override  
  59.     public boolean onDoubleTapEvent(MotionEvent e) {  
  60.         Toast.makeText(mContext, "DOUBLE EVENT " + e.getAction(), Toast.LENGTH_SHORT).show();  
  61.         return false;  
  62.     }  
  63.   
  64.     @Override  
  65.     public boolean onSingleTapConfirmed(MotionEvent e) {  
  66.         Toast.makeText(mContext, "SINGLE CONF " + e.getAction(), Toast.LENGTH_SHORT).show();  
  67.         return false;  
  68.     }  
  69. }  


STEP 2: 设置手势识别


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

  1. package noodies.blog.csdn.net;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.GestureDetector;  
  6. import android.view.MotionEvent;  
  7.   
  8. public class GestureTestActivity extends Activity {  
  9.     private GestureDetector mGestureDetector;  
  10.   
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.   
  16.         mGestureDetector = new GestureDetector(thisnew MyGestureListener(this));  
  17.     }  
  18.   
  19.     @Override  
  20.     public boolean onTouchEvent(MotionEvent event) {  
  21.         return mGestureDetector.onTouchEvent(event);  
  22.     }  
  23. }  


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

  1. package noodies.blog.csdn.net;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.GestureDetector;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8.   
  9. public class MyView extends View {  
  10.   
  11.     private GestureDetector mGestureDetector;  
  12.   
  13.     public MyView(Context context, AttributeSet attrs) {  
  14.         super(context, attrs);  
  15.   
  16.         mGestureDetector = new GestureDetector(context, new MyGestureListener(context));  
  17.   
  18.         setLongClickable(true);  
  19.   
  20.         this.setOnTouchListener(new OnTouchListener() {  
  21.   
  22.             public boolean onTouch(View v, MotionEvent event) {  
  23.                 return mGestureDetector.onTouchEvent(event);  
  24.             }  
  25.   
  26.         });  
  27.     }  
  28. }  


  • 陷阱


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

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

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


  • 测试结果

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

  1. 单击:down 0, single up 1, single conf 0  
  2. 短按:down 0, show 0, single up 1  
  3. 长按:down 0, show 0, long 0  
  4. 双击:down 0, single up 1, double 0, double event 0, down 0, double event 1  
  5. 滚动:down 0, (show 0), scrool 2...  
  6. 滑动:down 0, (show 0), scrool 2..., fling 1  



转自:noodies的专栏


顶 12踩 0收藏
分享到:
更多
文章评论
    发表评论

    个人资料

    • 昵称: 小蜜锋
    • 等级: 高级设计师
    • 积分: 7724
    • 代码: 753 个
    • 文章: 358 篇
    • 随想: 211 条
    • 访问: 995 次
    • 关注

    标签

    设计模式(4)java(9)命名规范(2)广告创意(1)愤怒的小鸟(1)游戏(5)jsp(1)配置(1)Surface(1)windows(1)javabean(1)设计方法(1)开发工具(2)web(4)大数据(2)GPU(1)硬盘(1)内部结构(1)黑客(1)窃取(1)编码(1)解决方法(1)php(28)mysql(9)数据库备份(1)数据库还原(1)命令(2)数据库(1)安装(1)2012(2)世界末日(3)仙剑5前传(1)默哀(1)电源(1)女生(1)装饰器模式(2)古剑奇谭(1)电脑桌(1)史上最牛(1)编程语言(2)小米(3)电视机顶盒(1)营销策略(1)Android(8)手势(1)诺亚方舟(1)Eclipse(1)汽车(1)操作系统(1)软件(1)互联网(5)大事记(1)设计师(2)壁纸(1)古剑奇谭2(1)古剑奇谭网络版(1)云计算(2)服务器(1)框架(2)Socket(1)jquery(1)构造函数执行顺序(1)火车票(1)3D(1)数据中心(2)正则表达式(2)Web前端(1)开发框架(1)系统瘫痪(1)12306(2)cpu(1)javascript(2)开发日记(15)体育馆管理系统(15)网页设计(1)CSS3(3)腾讯(3)小游戏(1)interface(1)平板(2)面试(2)设计(5)摄影(2)数据挖掘(1)钢琴谱(1)情人节(1)陈欧体(1)程序员(3)漫画(1)UserAgent(1)iPhone(2)NoSQL(1)ui(9)越狱(1)指南(1)abstract(1)css(3)git(2)八核(2)三星(1)linux(11)数据类型(1)html5(2)UML(2)perftools(1)创意(1)logo(1)色谱(1)响应式(5)Metro(2)虚拟机(1)jvm(1)垃圾回收(1)left(1)join(1)连接查询(1)溯源系统(1)Override(1)SAE(2)WordPress(1)指针(1)链表(1)系统分析师(1)中间件(1)corba(1)static(1)无线(1)监控(1)iPad(1)Apache(2)比特币(2)命名规则(1)手机支付(1)curl(3)笔记(1)导航(1)thinkphp(1)异常导致本地路径泄漏(1)web设计(1)网络安全(1)诗句(1)4K对齐(1)代码库(1)色彩(1)动画片(1)struts2(3)漏洞(5)确认框(1)心情驿站(1)ArscEditor(1)resources.(1)apktool(1)AppKey(1)新浪微博(1)app(5)广告(3)赚钱(1)响应式布局(1)html(1)淘宝(2)微信(1)重构(5)缓存(1)破解(1)后门(1)七夕(1)SEO(2)概念设计(1)面向对象(1)bootstrap(1)性能(2)优化(1)iis(1)爬虫(1)采集(1)算法(2)文本相似度(2)cto(1)js(1)fsockopen(1)扁平化设计(2)网页(1)心情(7)小米电视(1)开箱(1)励志(2)招聘(3)命名(1)notepad++(1)python(1)配色(3)扁平化(4)ps(2)搞笑(2)创业(3)渲染(1)电影(1)模板(1)微博(1)企业家(1)公司(1)总结(1)前端(1)运营(1)变形(1)svn(4)教程(3)搜狗(1)泄密(1)双11(1)天猫(1)UC(1)启动界面(1)光棍节(1)双十一(2)物流(1)备份(1)更新(1)插入(1)插件(2)jsTree(1)(1)海量数据(1)分辨率(1)草图(1)手绘(1)速度(1)文本处理(1)实习(1)感想(1)文件(1)简历(1)65.49.2.17(1)yum(1)解决办法(1)阿里云(2)推广(1)来往(1)春运(1)LBS(1)gb2312(1)utf-8(1)log4j(1)详解(1)收购(1)私服(1)TortoiseGi(1)post(1)异常(2)flappyBird(1)应用创新大赛(1)宙斯杯(1)学习方法(1)xp(1)退役(1)安全(1)技术贴(1)flash(1)刷机(1)京东(1)电商(1)Tomcat(1)JDK(1)免费(1)长投影(1)图标(1)Photoshop(1)云端集成开发环境(1)软件开发(1)可视化(1)工具(2)OpenSSL(1)Heartbleed(1)vsftp(1)中国知网(1)学术论文(1)免费下载(1)开发(1)手册(1)速查表(1)追随战略(1)sdk(1)文章(1)发布(1)文件管理(1)沙画(1)动效(2)原型(1)感悟人生(1)哲理(1)Bash(1)类图(1)知识管理(1)Console(1)调试命令(1)rpm(1)报错(1)挂载(1)数据盘(1)云主机(1)产品经理(1)原型设计(1)mql4(1)mt4(1)ea(1)程序化交易(1)CURLOPT_PO(1)阿里云​(1)CentOS6(2)OpenSSH(1)漏洞修复(2)升级(1)安骑士(1)链克(1)

    站长推荐