Android手势
2013-10-13 23:07
591 查看
通常用到的手势识别包括OnTouchListener和GestureDetector.OnGestureListener。 OnTouchListener是一切触摸事件的监听器,它会接收到一切的触摸事件。当我们点击屏幕、滑动、长按都会出现各种效果,其实这是由OnTouchListener监听到了,然后交给GestureDetector处理,GestureDetector通过分析知道当前的触摸事件是什么样的,再告诉OnGestureListener,就调用OnGestureListener中的对应方法处理事件。因为OnGestureListener是GestureDetector类用的接口,当然是通过 . 来引用了。说白了,GestureDetector只是封装了一些常用的手势,方便我们使用。在OnTouchListener中,我们完全可以自定义手势,而不用GestureDetector来分析。
让事实说话吧,举例子
package org.robam.touchtest; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ScrollView; import android.widget.TextView; public class MainActivity extends Activity implements OnTouchListener, OnGestureListener { TextView textview; ScrollView scrollview; private static final String TAGTOUCH = "OnTouchListener"; private static final String TAGGESTRURE = "OnGestureListener"; private GestureDetector GD; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = (TextView) findViewById(R.id.textview); textview.setOnTouchListener(this); //给TextView设置触摸的监听器,它才会响应触摸事件 GD = new GestureDetector(this); //new 一个手势识别器 } //这是OnTouchListener接口的唯一方法,TextView的触摸事件首先由它处理 @Override public boolean onTouch(View v, MotionEvent event) { Log.e(TAGTOUCH, "onTouchListener -- onTouch"); return GD.onTouchEvent(event); //这一句话很关键,调用GestureDetector的onTouchEvent方法,意思是交GestureDetector处理 } //GestureDetector处理完后,如果匹配一下6个方法,就给相应的方法处理,以下6个方法都是OnGestureListener中定义的 /* 顾名思义手指按下的时候就会触发 * @see android.view.GestureDetector.OnGestureListener#onDown(android.view.MotionEvent) */ @Override public boolean onDown(MotionEvent e) { Log.e(TAGGESTRURE, "OnGestureListener -- onDown"); return true; //注意这个返回值好像要true,后面的onFling和onScroll才能被处理哦! } /* * The user has performed a down MotionEvent and not performed a move or up yet. * This event is commonly used to provide visual feedback to the user to let them know that * their action has been recognized i.e. highlight an element. * 当用户按下没有移动或者放开手指时触发,根据名字可以看出,它是用来show显示一些提示信息的。 * 这个方法在按紧0.18秒触发,不能滑动也不能放开 * 注意跟下面的onLongPress区别,其实只不过这个时间短一点,本质是一样的 * @see android.view.GestureDetector.OnGestureListener#onShowPress(android.view.MotionEvent) */ @Override public void onShowPress(MotionEvent e) { Log.e(TAGGESTRURE, "OnGestureListener -- onShowPress"); } /* * 手指按下后弹开的时候触发 * 注意,只要手指滑动了再弹开,它是不会触发的。而且长按后也不会触发。也就是在按下0到0.68秒间放开触发 * @see android.view.GestureDetector.OnGestureListener#onSingleTapUp(android.view.MotionEvent) */ @Override public boolean onSingleTapUp(MotionEvent e) { Log.e(TAGGESTRURE, "OnGestureListener -- onSingleTabUp"); return true; } /* * 从名字可以看出,它是滚动的时候触发。 * 那它在滚动的过程中会触发多少次呢?、 * 一秒钟内会触发很多次,但我暂时不知道在哪里找确切的答案,onTouch触发多少次就是多少。 * 还有,这也是要滑动一定的距离才会触发,到底多少,暂时找不到答案,原谅我! * @see android.view.GestureDetector.OnGestureListener#onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float) */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.e(TAGGESTRURE, "OnGestureListener -- onScroll --- " + e1.getX() + "----" + e2.getX()); return true; } /* * 长按触发事件,不用多说,前提是不能滑动。 * 关键是:多少秒算长按呢?没错,就是 0.18 + 0.5 = 0.68 秒 * @see android.view.GestureDetector.OnGestureListener#onLongPress(android.view.MotionEvent) */ @Override public void onLongPress(MotionEvent e) { Log.e(TAGGESTRURE, "OnGestureListener -- onLongPress"); } /* * 这就是滑动之后放开手指触发的事件,当然触发也是有条件的, * 就是... 滑动速度要达到系统定义的最小值。跟手机的dip息息相关。 * 手机dip/160 * 100 * 50 + 0.5,就是每秒要划过这么多像素才会触发。 * @see android.view.GestureDetector.OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float) */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { Log.e(TAGGESTRURE, "OnGestureListener -- onFling"); return true; } }
Layout文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello_world" android:textSize="30sp" /> </LinearLayout>
运行程序后在LogCat可以看到各个事件的触发情况。
其实上面解释 都差不多了,就不再啰嗦!我是从分析GestureDetector源码得到的,最关键的当然是识别手势的具体函数 onTouchEvent……
有什么不对请拍砖~
相关文章推荐
- Ubuntu下Android开发:手机不能识别
- Android开发探秘之三:利用jsoup解析HTML页面
- android bitmap和base64之间的转换
- Android 内存溢出解决方案(OOM) 整理总结
- Android TextView中文字设置超链接、颜色、字体 大杂烩
- 安卓系统源码编译系列(二)——安卓系统源码编译教程
- Android APK的数字签名的作用和意义
- Android系统权限和root权限
- Android---把Wi-Fi P2P用于服务发现
- Android UDP收发开发及问题解决
- 基于MQTT协议推送Android消息
- android 以追加形式写文件并把文件保存到SD卡中
- Android开发探秘之二:导入存在的项目及其注意事项
- Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Android上使用sqlite,提示sqlite: not found
- Android_ListView_Adapter使用和数据动态加载
- Android动画 Tweened Animation 之 AlphaAnimation
- Android 平台语音通话及回音消除、噪音消除研究
- android中通过contentprovider访问通讯录代码实现(两种方法实现)