Android的触摸屏手势事件
来源:互联网 发布:山东齐鲁网络电视台 编辑:程序博客网 时间:2024/05/17 06:18
这篇专题来研究一下Android的触摸屏手势Gesture,Android的手势有两种,一种是View和Activity的(基于触摸屏事件,所以Activity也能添加手势),一种是手写输入法或者一些手机浏览器的快捷手势那样的带笔迹的手势识别。这一点从API文档中就能体现出来:分别有android.view.GestureDetector和android.gesture.Gesture。
我们先来介绍View和Activity的手势,再介绍输入法手势识别。
View和Activity的手势
这一部分想必大家都已经非常熟悉了,现在很多APP都会加入手势来提高交互体验,其中在某个界面向右Fling关闭该界面这一操作貌似成了APP的标配了。废话不多说了,直接进入正题。
为View和Activity加入手势操作的步骤如下:
1、为View或者Activity实现OnGestureListener接口。
2、覆写View或者Activity的OnTouchEvent方法,这里要返回GestureDetector.onTouchEvent()。
3、覆写你需要的手势的回调方法。
这里解释一下各种回调方法的含义:
按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
除了这些定义之外,鄙人也总结了一点算是经验的经验吧,在这里和大家分享一下。
任何手势动作都会先执行一次按下(onDown)动作。
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。
抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress): 手指按在持续一段时间,并且没有松开。
滚动(onScroll): 手指在触摸屏上滑动。
按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
除了这些定义之外,鄙人也总结了一点算是经验的经验吧,在这里和大家分享一下。
任何手势动作都会先执行一次按下(onDown)动作。
长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。
我这里贴上一段代码,大家可以看一下实现的步骤,实验代码和触摸屏事件专题的代码差不多,我就不重复上传了。
在OnGestureListener的带返回值的几个回调方法默认返回false的情况下,你会发现Fling手势是识别不到的,这是什么原因呢?这需要用上一专题的知识来解释http://blog.csdn.net/benbmw2008/article/details/11143893。大家应该能看出来手势是基于触摸屏事件传递的,对照着上一篇的“默认事件流向”图,读者可以想象其实就是在“MyTextView onTouchEvent”和“MyRelativeLayout onTouchEvent”之间加一个"MyTextView's GestureDetector onTouchEvent",而"MyTextView's GestureDetector onTouchEvent"返回false,事件还是会继续传递给“MyRelativeLayout onTouchEvent”。解决的办法是什么呢?自然是把OnGestureListener的带返回值的几个回调方法返回true,这样触摸屏事件就被“GestureDetector onTouchEvent”所消费,看一下日志会更加清楚:
09-08 10:36:10.714: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.718: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.824: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.828: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.832: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.835: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.835: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.863: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.878: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->onFling
09-08 10:36:10.718: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.722: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.824: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.828: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.832: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.835: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.835: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.863: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.878: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.886: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.898: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MainActivity--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyRelativeLayout--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyRelativeLayout--->onInterceptTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->dispatchTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->onTouchEvent
09-08 10:36:10.917: V/gesturedemo(13130): MyTextView--->onFling
Activity的手势实现和View的是一样的,这里就不重复说了,只不过你不用再修改手势回调方法的返回值了。
下面我又突然想到了一个问题,就是手势区域重复了怎么办?举个例子,有一个只包含一个View的Activity,需要实现在View区域向右Fling关闭Activity,向下Fling做别的一些操作,
1、如果逻辑都实现在View上是非常简单的,在onFling中直接判断就可以了。
2、但是有的情况只允许向右Fling的判断实现在Activity中,向下Fling的判断实现在View中(或者相反,总之是分开判断),这个时候又该怎么办?
对于第二种情况,答案还是很有意思的,读者如果感兴趣的话可以发表评论,有营养的评论超过5条后我会将答案的代码下载地址放在文章的最后。
输入法手势识别
在手写输入中,会为每一个字符定义一个特征码,这些特征码都保存在相应的文件中(可能有一个或多个这样的文件),当用户绘制一个描述字符的图形时,系统会为所绘制的图形提取特征码,然后会在保存特征码文件中查找相对应的特征码,如果找到,就会将对应的字符返回。其中,这些文件被称为手势文件。
我们来做一个简单的手势识别APP。
一、首先需要建立手势文件,这里需要借助SDK自带的Sample,大家在Eclipse中File--->New--->Project--->Android--->Android Sample Project,选择GestureBuilder,运行之,建立几个自己的手势,然后把手势文件拿出来即可(每建立一个手势会有一个Toast弹出,告诉你文件的保存路径)。
其实可以想像gestures手势文件中就是一个一个的键值对。
二、把gestures文件放入工程的res/raw目录下,有关raw和assets的区别,请移步http://blog.csdn.net/benbmw2008/article/details/8754373。
布局文件如下:
代码如下:
好了,今天的内容就到这里了,第一周更新了两篇专题,是个良好的开始,嗯嗯,加油。
- Android的触摸屏手势事件
- android触摸屏事件手势操作滑动处理
- android的触摸屏事件
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理、GestureDetector用法
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理 .
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- android手势操作滑动效果触摸屏事件处理
- Document Filtering
- 华为机考回忆版
- Python yield 使用浅析
- gdb
- vs2010中文输入法不起作用的原因
- Android的触摸屏手势事件
- Android ADB Command
- 最新Oracle 和 mysql 的对比参照
- OCP-1Z0-053-V12.02-580题
- 11个程序员幽默代码注释
- Decorator装饰器模式Java示例学习
- ubuntu下安装JRE
- [LeetCode] Combination Sum II
- 全局事务与本地事务的区别应用(从代码方面来探讨的)