Android 手势研究(-)

原创 2015年07月07日 11:33:23
手势即手触摸屏幕做出动作。

View可以通过onTouchEvent收到触摸屏幕事件,
我们可以通过View.setOnTouchListener()设置事件监听器
或者override onTouchEvent()来拦截这些事件,
在拦截函数中判断触摸点的轨迹及运动速度就可以判断出是什么手势。

Android系统提供了GestureDetector来方便手势的判断,即:在拦截函数中每次touchevent都把事件作为参数调用GestureDetector.onTouchEvent(),当有手势被识别出后,就会通知调用者。

为了能通知到调用者,GestureDetector在构造时要求传入一个实现了OnGestureListener接口的对象,
通过此对象就可以接收到各种手势通知了。

首先先用textview来实验:
用一个ViewFlipper放置两个Textview,当手指在屏幕上左右移动时进行进行切换。
由于textview本身不会处理touchevent,而是会将其继续上传,所以textview布局时layout_width及layout_height没有影响。
如果touch事件发生在textview上会继续上传到viewflipper;如果发生在viewflipper上那么就直接处理。
所以我们应该拦截发生在ViewFlipper上的touchEvent,并进行处理。

代码如下,在onCreate中完成界面布局及事件拦截函数设置:
Java代码 复制代码 收藏代码Android <wbr>手势研究(-)
  1. //创建一个ViewFlipper   
  2.         mVf = new ViewFlipper(this);   
  3.         //ViewFlipper打开长点击支持。如果不打开,无法收到长时间点击,那么手势判断就无从进行。   
  4.         mVf.setLongClickable(true);   
  5.         //拦截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent来处理   
  6.         mVf.setOnTouchListener(new OnTouchListener() {             
  7.             @Override  
  8.             public boolean onTouch(View v, MotionEvent event) {   
  9.                 return mVfDetector.onTouchEvent(event);   
  10.             }   
  11.         });   
  12.            
  13.         //添加一个textview。textview不能setLongClickable(true),   
  14.         //如果设置了那么发生在textview上的touch事件就无法传给viewflipper,   
  15.         //无法被手势识别对象处理了。   
  16.         TextView tv = new TextView(this);   
  17.         tv.setText("TextView 1");   
  18.         tv.setBackgroundColor(0xffffffff); //设置一个白色背景,方便看到textview区域   
  19.         mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));   
  20.            
  21.         //再添加一个textview   
  22.         TextView tv2 = new TextView(this);   
  23.         tv2.setText("TextView 2");   
  24.         tv2.setBackgroundColor(0xffffffff);   
  25.         mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));   
  26.                   
  27.         //将viewFlipper作为Activity的主view显示   
  28.         setContentView(mVf);  
//创建一个ViewFlipper
        mVf = new ViewFlipper(this);
        //ViewFlipper打开长点击支持。如果不打开,无法收到长时间点击,那么手势判断就无从进行。
        mVf.setLongClickable(true);
        //拦截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent来处理
        mVf.setOnTouchListener(new OnTouchListener() {                  
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                return mVfDetector.onTouchEvent(event);
                        }
                });
        
        //添加一个textview。textview不能setLongClickable(true),
        //如果设置了那么发生在textview上的touch事件就无法传给viewflipper,
        //无法被手势识别对象处理了。
        TextView tv = new TextView(this);
        tv.setText("TextView 1");
        tv.setBackgroundColor(0xffffffff); //设置一个白色背景,方便看到textview区域
        mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        
        //再添加一个textview
        TextView tv2 = new TextView(this);
        tv2.setText("TextView 2");
        tv2.setBackgroundColor(0xffffffff);
        mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
               
        //将viewFlipper作为Activity的主view显示
        setContentView(mVf);


在监听器中用到了GestureDetector对象,其是一个类成员对象,用如下代码创建:
Java代码 复制代码 收藏代码Android <wbr>手势研究(-)
  1. private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {   
  2.         //手指在屏幕上移动距离小于此值不会被认为是手势   
  3.         private static final int SWIPE_MIN_DISTANCE = 120;   
  4.         //手指在屏幕上移动速度小于此值不会被认为手势   
  5.         private static final int SWIPE_THRESHOLD_VELOCITY = 200;   
  6.            
  7.         //手势识别函数,到此函数被系统回调时说明系统认为发生了手势事件,   
  8.         //我们可以做进一步判定。   
  9.         @Override  
  10.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   
  11.             //如果第1个坐标点大于第二个坐标点,说明是向左滑动   
  12.             //滑动距离以及滑动速度是额外判断,可根据实际情况修改。   
  13.             if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&    
  14. Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {   
  15.                 //left   
  16.                 Log.i("GestureDemo""ViewFlipper left");   
  17.                 mVf.showNext();   
  18.                 return true;   
  19.             }else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&    
  20. Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {   
  21.                 //right   
  22.                 Log.i("GestureDemo""ViewFlipper right");   
  23.                 mVf.showPrevious();    
  24.                 return true;   
  25.             }   
  26.             return false;   
  27.         }   
  28.                 ... ...   
  29.                 ... ...   
  30.          });   
  31. }  

出处:http://mypyg.iteye.com/blog/761331

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android&nbsp;手势研究(-)

手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设置事件监听器 或者override onTou...

Android研究之手势交互实例实现详解

 先来几张效果图: 一、没有抛掷: 二、向右抛掷一次 三、向右再抛掷一次 接下来说说Android开发中对于手势动作的识别 参考资料。。。 首先,在Android系统中,每...

Android手势传递一般过程及其规则研究

1.手势传递一般过程 Android 手势传递通过dispatchTouchEvent 、onInterceptTouchEvent(ViewGroup特有)、onTouchEvent View手...
  • ljzdyh
  • ljzdyh
  • 2016年10月24日 13:46
  • 403

Android开源项目-Jamendo音乐播放器研究与优化-手势操作

【五线谱上确定音的高低的记号叫做谱号,谱号有三种:G谱号(高音谱号)、F谱号(低音谱号)和C谱号(中音谱号)】  --- 《五线谱基础教程》   Jamendo的手势操作用于控制歌曲的播放,...
  • ACE1985
  • ACE1985
  • 2012年08月20日 23:56
  • 4568

iOS&nbsp;触摸和手势总结

触摸: 触摸表示手指在屏幕上的接触或移动并作为唯一多点触摸序列的一部分。 关闭事件投递 在缺省情况下,视图接收触摸事件,你可以设置视图的userInteractionEnable属性为NO来关闭对...

中国区块链研究联盟成立&nbsp;区块…

比特币仍备受争议,但其背后的技术——数据区块链(BlockChain),却被寄望成为金融领域的颠覆性力量。   昨日(1月5日),全球共享金融100人论坛(GSF100)宣布成立“中国区块链研究联盟...

动态手势识别技术研究与实现

  • 2017年08月23日 14:28
  • 2.05MB
  • 下载

研究安卓手势相关的监听事件

android os 支持丰富的手势操纵,点击、长按、滑动等,今天主要研究了下支持这些手势操纵实现的监听事件:OnTouch和OnClick,这两个响应事件有什么区别?如果我要在界面上按下按钮,执行某...
  • zwq1457
  • zwq1457
  • 2012年09月13日 14:22
  • 723

滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放

直接贴代码: 第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究 /** *实现一个利用手势缩放图片的小例子 *当手势是从左到右滑动的时候,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android&nbsp;手势研究(-)
举报原因:
原因补充:

(最多只允许输入30个字)