android的手势识别是android更人性化,让我们的操作更简单, 其实我们日常应用中不少地方都使用了手势识别方法 比如 2011年那么火的 愤怒的小鸟 中的 发射武器, uc 游览器 的左右滑动功能,这都是可以使用android的手势识别来实现。

如果想要实现提高我们app 的用户体验,更具有可操作性,那这时android的GestureDetector 就派上用场了 , 我们先开看看GestureDetector这个类的api 给我们提供了哪些操作。

下面是GestureDetector 这个类的概括情况

根据 MotionEvent事件检测各种手势. GestureDetector.OnGestureListener 回调函数用于通知用户发生的手势动作。该类仅处理 MotionEvent 事件中的触摸事件(不处理轨迹球事件)。 使用该类的方法如下:

1:首先需要在初始化的时候创建GestureDetector对象实例

下面看看摘自android 的api 的摘要

interface

GestureDetector.OnDoubleTapListener

The listener that is used to notify when a double-tap or a confirmed single-tap occur.

interface

GestureDetector.OnGestureListener

The listener that is used to notify when gestures occur.

class

GestureDetector.SimpleOnGestureListener

A convenience class to extend when you only want to listen for a subset of all the gestures.

接口 OnDoubleTapListener 手势监听器 用于双击时发出通知

接口 OnGestureListener 手势监听器 用于发送手势操作时发生通知 如 拖动,长按,按下,弹起 等手势操作

类 SimpleOnGestureListener GestureDetector的扩展类 这个类的作用是当我们只想使用部分手势时, 而非全部的时候 就可以继承这个类

GestureDetector 还有几个公共方法 如下

boolean

isLongpressEnabled() 判定是否允许长点击

boolean

onTouchEvent(MotionEvent ev)

分析给定的动作事件,如果满足条件,就触发GestureDetector.OnGestureListener 中提供的回调函数。

void

setIsLongpressEnabled(boolean isLongpressEnabled)

设置是否允许长按。如果允许长按,当用户按下并保持按下状态时, 将收到一个长按事件,同时不再接收其它事件;如果禁用长按, 当用户按下并保持按下状态然后再移动手指时,将会接收到滚动事件。 长按默认为允许。

void

setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener)

设置双击及其相关手势的监听器。

OnGestureListener 接口 的公共方法 如果你想在你的app view中实现下面这些手势操作的话 继承该接口 并实现下面这些方法即可

abstract boolean

onDown(MotionEvent e)

当轻触手势按下屏幕 时发生的事件.

abstract boolean

onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

快速滑动后抬起事件的通知.

abstract void

onLongPress(MotionEvent e)

长按时的通知事件

abstract boolean

onScroll(MotionEvent e1, MotionEvent

e2, float distanceX, float distanceY)

滑动屏幕时通知事件 为了方便提供了X轴和Y轴上的滚动距离.

abstract void

onShowPress(MotionEvent e)

当用户长点击后抬起时通知事件

abstract boolean

onSingleTapUp(MotionEvent e)

当轻触手势抬起屏幕时发生的事件.

OnDoubleTapListener 接口的公共方法

abstract boolean

onDoubleTap(MotionEvent e)

双击发生时的通知。

abstract boolean

onDoubleTapEvent(MotionEvent e)

双击手势过程中发生的事件,包括按下、移动和抬起事件。

abstract boolean

onSingleTapConfirmed(MotionEvent e)

发生确定的单击时执行。

onSingleTapUp(MotionEvent)不同, 该事件在探测器确定用户单击后没有发生导致双击事件的第二次单击时发生。

在实际应用中 我们根据我们所需要的功能实现不同的接口 或者 继承自SimpleOnGestureListener 类 只实现部分个人需要的方法 就可以了,我们这一章就以 OnGestureListener 接口来做示例 看看 他是怎么使用的直接看代码 GameSurfaceView类

有一点大家需要注意一下 每次执行手势时 可以会执行多个手势通知 大家需要留意一下喔,避免重复操作app逻辑

上面的代码中 红色部分标示了 手势识别的主要部分 大家赶快加到自己的app 里面吧 让自己的app 更有吸引力 其他两种种方式 和这种很类似,各位童鞋可以自己试试喔

/** * android 手势识别 *  * @author mahaile *  */public class GameSurfaceView extends SurfaceView implements Callback,OnGestureListener {private String TAG = "GameView";boolean flag; // 线程标示位 当为false时停止刷新界面SurfaceHolder surfaceHolder;GameViewThread gameViewThread;float x = 0, y = 0;int stat = 0; // 手势识别状态标示private GestureDetector gd; // 手势Context context;int width, height;Bitmap bitmap_role;public GameSurfaceView(Context context) {super(context);this.context = context;surfaceHolder = this.getHolder();surfaceHolder.addCallback(this); // 添加回调// 设置焦点 如果不设置焦点的话 在该界面下 点击触摸屏是无效的 默认为falsesetFocusableInTouchMode(true);bitmap_role = BitmapFactory.decodeResource(getResources(),R.drawable.role);gd = new GestureDetector(this); // 创建手势监听对象}public void onDraw(Canvas canvas) {canvas.drawColor(Color.BLACK);// canvas.drawBitmap(bitmap_role, width/2-bitmap_role.getWidth()/2, y,// null);canvas.drawBitmap(bitmap_role, x - bitmap_role.getWidth() / 2, y- bitmap_role.getHeight() / 2, null);}// 重写父类中的 onTouchEvent就可以监听到 触摸事件了 记住要设置焦点喔@Overridepublic boolean onTouchEvent(MotionEvent event) {gd.onTouchEvent(event); // 通知手势识别方法return true;}public void surfaceChanged(SurfaceHolder surfaceHolder, int format,int width, int height) {}public void surfaceCreated(SurfaceHolder surfaceHolder) {// 获取屏幕的 宽高 只有在 surface创建的时候 才有效 ,才构造方法中获取 宽高是获取不到的width = this.getWidth();height = this.getHeight();// 初始化绘图线程gameViewThread = new GameViewThread();gameViewThread.flag = true;gameViewThread.start();}public void surfaceDestroyed(SurfaceHolder surfaceHolder) {gameViewThread.flag = false; // 销毁线程}class GameViewThread extends Thread {public boolean flag;public void run() {while (flag) {Canvas canvas = null;try {canvas = surfaceHolder.lockCanvas(); // 锁定画布 并获取canvasonDraw(canvas);// 调用onDraw 渲染到屏幕surfaceHolder.unlockCanvasAndPost(canvas); // 此步不要忘记了喔} catch (Exception e) {e.printStackTrace();}try {Thread.sleep(10);// 线程休眠时间 控制帧数} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 每一秒刷新一次}}}// **************************下面是手势识别的重写方法*******************************************// 屏幕点下public boolean onDown(MotionEvent arg0) {Log.d(TAG, "onDown");Toast.makeText(this.context, "你点击了屏幕", Toast.LENGTH_SHORT).show();return false;}// 屏幕点下public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {Log.d(TAG, "onFling");Toast.makeText(this.context, "你拖动屏幕后弹起", Toast.LENGTH_SHORT).show();return false;}// 屏幕点下 并长按时触发public void onLongPress(MotionEvent e) {Log.d(TAG, "onLongPress");Toast.makeText(this.context, "你长按了屏幕", Toast.LENGTH_SHORT).show();}// 屏幕拖动public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {this.x = this.x - distanceX;this.y = this.y - distanceY;Toast.makeText(this.context, "你拖动了屏幕", Toast.LENGTH_SHORT).show();return false;}// 屏幕长按public void onShowPress(MotionEvent e) {// TODO Auto-generated method stubToast.makeText(this.context, "你长按屏幕后弹起", Toast.LENGTH_SHORT).show();Log.d(TAG, "onShowPress");}// 屏幕点击后弹起public boolean onSingleTapUp(MotionEvent e) {Log.d(TAG, "onSingleTapUp");Toast.makeText(this.context, "你弹起屏幕", Toast.LENGTH_SHORT).show();return false;}}

下面是源码地址

http://download.csdn.net/detail/ma_haile/4221223

更多相关文章

  1. 一种粗暴快速的 Android 全屏幕适配方案
  2. 浅谈Android事件分发机制
  3. Android 监听Home键按键事件
  4. Android事件传递(分发)机制
  5. Android屏幕适配 重点盘点
  6. Android中切换屏幕方向时Activity生命周期函数执行情况分析
  7. Android ViewGroup中事件触发和传递机制
  8. Android开发:最全面、最易懂的Android屏幕适配解决方案

随机推荐

  1. SQL Server Page结构深入分析
  2. 详解SQL Server表和索引存储结构
  3. SQLserver排序规则基本概念探索
  4. SqlServer类似正则表达式的字符处理问题
  5. System表空间不足的报警问题浅析
  6. SQL提取数据库表名及字段名等信息代码示
  7. SQL行转列和列转行代码详解
  8. 浅谈sqlserver下float的不确定性
  9. SQLserver中cube:多维数据集实例详解
  10. sqlserver:查询锁住sql以及解锁方法