`
384444165
  • 浏览: 258740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 触屏事件处理_手势识别

 
阅读更多

转自 http://mahaile.blog.51cto.com/2891586/831105

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类

 

package yxqz.com;


import android.content.Context;

import android.content.DialogInterface;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.util.Log;

import android.view.GestureDetector;

import android.view.GestureDetector.OnGestureListener;

import android.view.MotionEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.SurfaceHolder.Callback;

import android.widget.Toast;


/**

* 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); //添加回调

//设置焦点 如果不设置焦点的话 在该界面下 点击触摸屏是无效的 默认为false

setFocusableInTouchMode(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就可以监听到 触摸事件了 记住要设置焦点喔

@Override

public 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(); //锁定画布 并获取canvas

onDraw(canvas);//调用onDraw 渲染到屏幕

surfaceHolder.unlockCanvasAndPost(canvas); //此步不要忘记了喔 否则界面上显示不出来的

}catch(Exception e){

e.printStackTrace();

}

try {

Thread.sleep(10);//线程休眠时间 控制帧数

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.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 stub

Toast.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;

}

}

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

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


在后续的过程中 我们会有一章 游戏地图 介绍 的章节 , 那时我们使用手势识别来拖动地图

 

欢迎各位童鞋 来拍砖喔,,有啥不懂的地方留言给我喔 一起学习 共同进步 加油 。。

下面是源码地址

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


 

现在我们来分析下GestureDetector这个类的概括情况

 

2:在View中的onTouchEvent方法中调用GestureDetector对象中的onTouchEvent方法当事件发生的时候就可以回调该方法

分享到:
评论

相关推荐

    android触屏手势识别

    总结起来,Android触屏手势识别涉及了触摸事件处理、`GestureDetector`、`ScaleGestureDetector`、`GestureOverlayView`以及自定义手势识别等多个方面。理解并熟练运用这些知识点,可以创建出更加直观、友好的用户...

    Android触屏手势识别Demo源码.rar

    Android系统基于触摸屏设备设计,提供了丰富的触控事件处理机制。主要的触摸事件类有`MotionEvent`,它包含了触摸事件的各种信息,如ACTION_DOWN(手指触摸屏幕)、ACTION_MOVE(手指在屏幕上移动)、ACTION_UP...

    Qt for android触摸手势事件QGestureEvent

    这些手势可以映射到特定的QGesture对象,由QGestureEvent类来封装并传递给相应的事件处理函数。 **QGestureEvent** QGestureEvent是Qt事件系统的一部分,它包含了在触摸屏上发生的所有手势信息。当用户执行手势时,...

    Android应用源码之(触屏手势识别).zip

    在Android应用开发中,触屏手势识别是提升用户体验的关键技术之一。通过手势识别,用户可以以更直观、自然的方式与应用程序交互,而不仅仅局限于点击和滑动。本篇将深入探讨"Android应用源码之(触屏手势识别)"的相关...

    安卓Android源码——(触屏手势识别).rar

    触屏手势识别是指通过检测用户在触摸屏上的连续或独立的手势动作,如滑动、点击、双击、捏合等,将这些动作转化为可识别的操作指令。这种技术使得用户能够以更自然、直观的方式与设备交互,极大地提升了用户体验。 ...

    GestureRecognitionV1_QT_qt手势识别_qt手势_动作识别_against1l6_源码.rar.rar

    该压缩包文件“GestureRecognitionV1_QT_qt手势识别_qt手势_动作识别_against1l6_源码.rar.rar”显然包含了基于Qt框架的手势识别和动作识别的源代码。Qt是一个跨平台的应用程序开发框架,广泛用于创建桌面、移动和...

    android手势库识别

    在Android开发中,手势识别是提升用户体验的重要一环。Android手势库识别主要涉及的是如何让应用能够理解并响应用户的触摸动作,从而实现更直观、更便捷的交互方式。本教程适用于初学者,将深入探讨如何在Android...

    简述Android触摸屏手势识别

    本文将探讨如何在Android中实现触摸屏手势识别,主要关注`GestureDetector.OnGestureListener`接口及其相关事件处理。 首先,Android事件处理机制的核心是监听器(Listener),这在触摸屏事件中也不例外。例如,...

    Android程序研发源码Android 触屏手势识别GestureTest.zip

    `GestureTest.zip`这个压缩包文件包含了一个专门用于研究和实践Android触屏手势识别的项目实例,它可以帮助开发者深入理解并掌握这一核心技术。 首先,我们要了解Android中的手势识别框架。在Android SDK中,Google...

    安卓Android源码——触屏手势识别GestureTest.zip

    "安卓Android源码——触屏手势识别GestureTest.zip"是一个专注于手势识别的项目,它帮助开发者深入理解如何在Android应用中实现对用户触摸屏幕行为的智能解析。 在Android系统中,触屏手势识别是通过`...

    Android手势识别源码

    在Android中,手势识别通常基于触摸屏事件(MotionEvent)来实现。当用户在屏幕上滑动、点击或执行其他动作时,系统会生成一系列MotionEvent对象,这些对象包含了时间戳、坐标、动作类型等信息。开发者可以通过监听...

    安卓Android源码——(触屏手势识别).zip

    这份"安卓Android源码——(触屏手势识别).zip"压缩包很可能包含了一个示例项目,展示了如何在Android应用中实现触屏手势的检测与处理。下面,我们将深入探讨触屏手势识别在Android开发中的相关知识。 1. **手势识别...

    安卓 android 用户自定义手势 手势识别

    手势识别是通过设备的触摸屏传感器捕捉用户的触摸动作,然后由软件算法分析这些动作,将其转化为可执行的命令。在安卓系统中,手势识别通常涉及两个主要部分:手势捕获和手势解析。手势捕获负责收集用户的触摸数据,...

    android 手势识别学习

    在Android开发中,手势识别是构建用户交互丰富的应用程序的关键部分。手势识别允许用户通过触摸屏设备的各种动作来控制和操作应用,例如滑动、点击、捏合等。本教程将聚焦于Android手势识别的实现,主要关注`...

    Android 触屏手势识别GestureTest.zip

    `GestureTest.zip`这个压缩包包含了一个关于Android触屏手势识别的示例项目,我们可以从其中的资源和源代码中学习到如何在Android应用中实现自定义的手势识别。 首先,`1_120912220646_2.png`和`1_120912220646_1....

    触屏手势识别程序

    在Android开发中,触屏手势识别是提升用户体验的关键技术之一。`GestureDetector.OnGestureListener`接口扮演着核心角色,它允许开发者识别并处理各种手势,如Fling、Scroll等。以下将详细介绍如何在Android中实现...

Global site tag (gtag.js) - Google Analytics