? Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等。这些Gesture会使用户体验大大提升。 Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。 首先,Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,就是通过onTouchListener实现; 其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的Listener; 第三,Listener一般会以Interface的方式来提供,其中包含一个或多个abstract方法,我们需要实现这些方法来完成 onTouch()、onKey()等操作。这样,程序便可以在特定的事件被dispatch到该view的时候,通过callback函数给予适当的响 应。 ? 1. Touch Screen Click举例 public???class??MyGesture??extends??Activity??implements??OnTouchListener? {???????? public???void??onCreate(Bundle?savedInstanceState) ?{???????????? super?.onCreate(savedInstanceState);???????????? setContentView(R.layout.main);???????????? TextView?tv?=?(TextView)?findViewById(R.id.tv);??????????? ?tv.setOnTouchListener(?this?);??????? ?}???????? public???boolean??onTouch(View?v,?MotionEvent?event) ?{???????????? Toast.makeText(?this?,??"Touch?Touch"?,?Toast.LENGTH_SHORT).show();???????????? return???false?;??????? ?}?? ??}?? 我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、 getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。 ? 2. 当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?这里我们需要GestureDetector.OnGestureListener接口的帮助,代码如下: public???class??MyGesture??extends??Activity??implements??OnTouchListener,?OnGestureListener? {???????? private??GestureDetector?mGestureDetector;???????? public??MyGesture() ?{???????????? mGestureDetector?=??new??GestureDetector(?this?);??????? ?}???????? public???void??onCreate(Bundle?savedInstanceState)? {???????????? super?.onCreate(savedInstanceState);???????????? setContentView(R.layout.main);??????????? ?TextView?tv?=?(TextView)?findViewById(R.id.tv);??????????? ?tv.setOnTouchListener(?this?);??????????? ?tv.setFocusable(?true?);???????????? tv.setClickable(?true?);???????????? tv.setLongClickable(?true?);???????????? mGestureDetector.setIsLongpressEnabled(?true?);???????? }??????????????? ??/*???????*?在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector????????*?来分析是否有合适的callback函数来处理用户的手势????????*/?????????? public???boolean??onTouch(View?v,?MotionEvent?event)? {??????????? ??return??mGestureDetector.onTouchEvent(event);??????? ?}??????????? //?用户轻触触摸屏,由1个MotionEvent?ACTION_DOWN触发???????? public???boolean??onDown(MotionEvent?arg0)? {???????????? Log.i(?"MyGesture"?,??"onDown"?);???????????? Toast.makeText(?this?,??"onDown"?,?Toast.LENGTH_SHORT).show();???????????? return???true?;???????? }???????????????? /*???????*?用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent?ACTION_DOWN触发????????*?注意和onDown()的区别,强调的是没有松开或者拖动的状态????????*/???????? public???void??onShowPress(MotionEvent?e) ?{???????????? Log.i(?"MyGesture"?,??"onShowPress"?);???????????? Toast.makeText(?this?,??"onShowPress"?,?Toast.LENGTH_SHORT).show();???????? }???????????????? //?用户(轻触触摸屏后)松开,由一个1个MotionEvent?ACTION_UP触发???????? public???boolean??onSingleTapUp(MotionEvent?e)? {??????????? ?Log.i(?"MyGesture"?,??"onSingleTapUp"?);???????????? Toast.makeText(?this?,??"onSingleTapUp"?,?Toast.LENGTH_SHORT).show();???????????? return???true?;??????? ?}??????????????? ??//?用户按下触摸屏、快速移动后松开,由1个MotionEvent?ACTION_DOWN,?多个ACTION_MOVE,?1个ACTION_UP触发???????? public???boolean??onFling(MotionEvent?e1,?MotionEvent?e2,??float??velocityX,??float??velocityY)? {???????????? Log.i(?"MyGesture"?,??"onFling"?);???????????? Toast.makeText(?this?,??"onFling"?,?Toast.LENGTH_LONG).show();???????????? return???true?;???????? }??????????????? ??//?用户按下触摸屏,并拖动,由1个MotionEvent?ACTION_DOWN,?多个ACTION_MOVE触发???????? public???boolean??onScroll(MotionEvent?e1,?MotionEvent?e2,??float??distanceX,??float??distanceY)? {???????????? Log.i(?"MyGesture"?,??"onScroll"?);??????????? ?Toast.makeText(?this?,??"onScroll"?,?Toast.LENGTH_LONG).show();???????????? return???true?;??????? ?}??????????????? ??//?用户长按触摸屏,由多个MotionEvent?ACTION_DOWN触发???????? public???void??onLongPress(MotionEvent?e) ?{???????????? Log.i(?"MyGesture"?,??"onLongPress"?);???????????? Toast.makeText(?this?,??"onLongPress"?,?Toast.LENGTH_LONG).show();??????? ?}?? ??} 3. Fling事件的处理代码:除了第一个触发Fling的ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外,我们还可以根据用 户在X轴或者Y轴上的移动速度作为条件。比如下面的代码中我们就在用户移动超过100个像素,且X轴上每秒的移动速度大于200像素时才进行处理。 public???boolean??onFling(MotionEvent?e1,?MotionEvent?e2,??float??velocityX,??float??velocityY) ?{??????? //?参数解释:???????? //?e1:第1个ACTION_DOWN?MotionEvent??????? //?e2:最后一个ACTION_MOVE?MotionEvent???????? //?velocityX:X轴上的移动速度,像素/秒??????? //?velocityY:Y轴上的移动速度,像素/秒??????????? //?触发条件?:???????? //?X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒???????????????? final???int??FLING_MIN_DISTANCE?=??100?,?FLING_MIN_VELOCITY?=??200?;???????? if??(e1.getX()?-?e2.getX()?>?FLING_MIN_DISTANCE?&&?Math.abs(velocityX)?>?FLING_MIN_VELOCITY)? {???????????? //?Fling?left???????????? Log.i(?"MyGesture"?,??"Fling?left"?);???????????? Toast.makeText(?this?,??"Fling?Left"?,?Toast.LENGTH_SHORT).show();???????? }? else???if??(e2.getX()?-?e1.getX()?>?FLING_MIN_DISTANCE?&&?Math.abs(velocityX)?>?FLING_MIN_VELOCITY)? {???????????? //?Fling?right???????????? Log.i(?"MyGesture"?,??"Fling?right"?);???????????? Toast.makeText(?this?,??"Fling?Right"?,?Toast.LENGTH_SHORT).show();???????? }???????? return???false?;??? }?? 这个例子中,tv.setLongClickable(true)是必须的,因为?只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN),我们同样可以通过layout定义中的android:longClickable来做到这一点。
form ?http://blog.csdn.net/uyu2yiyi/article/details/6310324
详细解决方案
android 动作处置之手势捕捉
热度:13 发布时间:2016-05-01 15:21:09.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法