`
veryEdu
  • 浏览: 17690 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android手机手势示例

 
阅读更多
android的手机主要以触摸屏为主,为了能够让用户体验到更多的手指滑动屏幕的乐趣,android提供了一套自己的手指滑动判断事件类。GestureDetector翻译成中文就是发现手势,专业术语叫做手势检测类。Detects various gestures and events using the supplied MotionEvents. 这是摘自android的API上面的一句话,意思就是 用提供给GestureDetector的事件检测手势和事件。
  大概思想就是创建GestureDetector,这个类没有无参的构造,更加详细的构造API上有。这里用的是 GestureDetector(GestureDetector.OnGestureListener listener)这个构造方法,传进去OnGestutre类型,再提供给它一个MotionEvent事件让Gesture自己去分析应该回调哪个函数。
在回调函数里面写自己的想法,一共有五个经常用的回调函数。
onDown,只要检测到手指触到屏幕了不管手指有没有拿起来都至少会调用一次onDown或者多次onDown函数。
onFling,专业的检测手指滑动事件就会调用该函数。
onLongPress,手指长按的时候就会调用该函数。
onScroll,这个函数需要跟onFling区别开来,这俩玩意个人感觉唯一的区别就是速度上的快慢而调用不同函数,onFling,正在飞,onScroll,正在滚,具体速度是多少才能区分出俩函数还需要更多的测试。
onShowPress,android的API上如是说:用户的手指触摸到屏幕了既没有移动也没有拿开的时候会调用该函数,这就需要跟onDown函数有点区分。onDown传进来的MotionEvent是down那就调用onDown,这都是API上的大概意思。
onSingleTapUp,当手指按下屏幕,并且检测到传进来的MotionEvent是up则调用该函数。
  多说无益直接写例子自己亲身感受这些函数之间的细微区别。还是毛嗲嗲说的好,实践出真知。这个例子是借鉴的网上某某的思想结合在hrd里面的做法写的例子,通过这个例子可以完整的看到当gestureDetector检测到什么操作的时候会调用神马函数。直接贴代码直接运行的

Activity代码,整个测试程序只有一个Activity
package opq.movcircle;

import android.app.Activity;
import android.os.Bundle;
import android.view.Display;

public class MainCircle extends Activity {
    /** Called when the activity is first created. */
	CircleView circleView;
	public static int scWidth;
	public static int scHeight;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Display display = getWindowManager().getDefaultDisplay();
		scWidth= display.getWidth();//得到屏幕宽
		scHeight= display.getHeight();//得到屏幕高
        circleView=new CircleView(this);//创建绘图类
        setContentView(circleView);
    }
}

CircleView中的代码,这个类继承自surface类,专门用来画图的类和实现俩接口:
package opq.movcircle;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class CircleView extends SurfaceView implements OnTouchListener,SurfaceHolder.Callback {
	MainCircle main;
	Paint paint;
	CircleViewDrawThread circleViewDrawThread;
	GestureDetector gestureDetector;
	
	public static float circleX=200;//得到 x坐标 用于改变圆的坐标
	public static float circleY=200;//同上
	
	/*这些个变量的作用是 初始化的时候都为false 当对应的方法调用之后给它设为true
	 * 在onDraw方法里面判断 显示哪些方法被调用了哪些方法没被调用
	 * 规则if后面都是对应的回调函数名
	 * */
	public static boolean ifOnDoubleTap=false;
	public static boolean ifOnDoubleTapEvent=false;
	public static boolean ifOnDown=false;
	public static boolean ifOnFling=false;
	public static boolean ifOnLongPress=false;
	public static boolean ifOnScroll=false;
	public static boolean ifOnShowPress=false;
	public static boolean ifOnSingleTapConfirmed=false;
	public static boolean ifOnSingleTapUp=false;
	public static boolean ifFingerUp;
	
	public CircleView(MainCircle main){
		super(main);
		this.main=main;
		getHolder().addCallback(this);
		circleViewDrawThread=new CircleViewDrawThread(this,getHolder());
		paint=new Paint();//绘图对象
		paint.setColor(Color.RED);//设置为红色
		paint.setTextSize(20);//如果画字体,设置字体大小
		gestureDetector=new GestureDetector(new CircleViewGestureListener());//创建手势检测类
		this.setOnTouchListener(this);
        this.setFocusable(true);   
        this.setClickable(true);   
        this.setLongClickable(true);
		
		
	}

	public boolean onTouch(View v, MotionEvent event) {
		if(event.getAction()==event.ACTION_UP){//当手指离开屏幕的时候 所有的判断方法变量全部初始化
			ifFingerUp=false;
			ifOnDoubleTap=false;
			ifOnDoubleTapEvent=false;
			ifOnDown=false;
			ifOnFling=false;
			ifOnLongPress=false;
			ifOnScroll=false;
			ifOnShowPress=false;
			ifOnSingleTapConfirmed=false;
			ifOnSingleTapUp=false;
		}
		return gestureDetector.onTouchEvent(event);
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawColor(Color.BLACK);//画黑色相当于更新画布
		/* 如果调用了onDown方法 ifOndown就为true 否则绘制else 后面的以此类推*/
		if(ifOnDown){canvas.drawText("onDown=true",0,0, paint);}else{canvas.drawText("onDown=false",0,0, paint);}
		if(ifOnDoubleTap){canvas.drawText("onDoubleTap=true",0,20, paint);}else{canvas.drawText("onDoubleTap=false",0,20, paint);}
		if(ifOnDoubleTapEvent){canvas.drawText("onDoubleTapEvent=true",0,40, paint);}else{canvas.drawText("onDoubleTapEvent=false",0,40, paint);}
		if(ifOnDown){canvas.drawText("onDown=true",0,60, paint);}else{canvas.drawText("onDown=false",0,60, paint);}
		if(ifOnFling){canvas.drawText("onFling=true",0,80, paint);}else{canvas.drawText("onFling=false",0,80, paint);}
		if(ifOnLongPress){canvas.drawText("onLongPress=true",0,100, paint);}else{canvas.drawText("onLongPress=false",0,100, paint);}
		if(ifOnScroll){canvas.drawText("onScroll=true",0,120, paint);}else{canvas.drawText("onScroll=false",0,120, paint);}
		if(ifOnShowPress){canvas.drawText("onShowPress=true",0,140, paint);}else{canvas.drawText("onShowPress=false",0,140, paint);}
		if(ifOnSingleTapConfirmed){canvas.drawText("ifOnSingleTapConfirmed=true",0,160, paint);}else{canvas.drawText("ifOnSingleTapConfirmed=false",0,160, paint);}
		if(ifOnSingleTapUp){canvas.drawText("ifOnSingleTapUp=true",0,180, paint);}else{canvas.drawText("ifOnSingleTapUp=false",0,180, paint);}
		canvas.drawLine(circleX,0,circleX,MainCircle.scHeight, paint);
		canvas.drawLine(0,circleY,MainCircle.scWidth,circleY, paint);
		canvas.drawCircle(circleX,circleY,50, paint);
	}
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		circleViewDrawThread.setFlag(true);
		circleViewDrawThread.start();//线程开始刷帧
	}
	public void surfaceCreated(SurfaceHolder holder) {
		
	}
	public void surfaceDestroyed(SurfaceHolder holder) {

	}
	class CircleViewGestureListener extends GestureDetector.SimpleOnGestureListener{//手势类
		@Override
		public boolean onDoubleTap(MotionEvent e) {
			Log.d("DEBUGMSG","onDoubleTap");
			CircleView.ifOnDoubleTap=true;
			return super.onDoubleTap(e);
		}
		@Override
		public boolean onDoubleTapEvent(MotionEvent e) {
			Log.d("DEBUGMSG","onDoubleTapEvent");
			CircleView.this.ifOnDoubleTapEvent=true;
			return super.onDoubleTapEvent(e);
		}
		@Override
		public boolean onDown(MotionEvent e) {
			Log.d("DEBUGMSG","onDown");
			CircleView.this.ifOnDown=true;
			return super.onDown(e);
		}
		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			CircleView.this.ifOnFling=true;
			Log.d("DEBUGMSG","onFling");
			return super.onFling(e1, e2, velocityX, velocityY);
		}
		@Override
		public void onLongPress(MotionEvent e) {
			CircleView.this.ifOnLongPress=true;
			Log.d("DEBUGMSG","onLongPress");
			super.onLongPress(e);
		}
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2,
				float distanceX, float distanceY) {
			Log.d("DEBUGMSG","onScroll");
			CircleView.this.ifOnScroll=true;
			CircleView.this.circleX=e2.getX();CircleView.this.circleY=e2.getY();
			return super.onScroll(e1, e2, distanceX, distanceY);
		}
		@Override
		public void onShowPress(MotionEvent e) {
			Log.d("DEBUGMSG","onShowPress");
			CircleView.this.ifOnShowPress=true;
			super.onShowPress(e);
		}
		@Override
		public boolean onSingleTapConfirmed(MotionEvent e) {
			Log.d("DEBUGMSG","onSingleTapConfirmed");
			CircleView.this.ifOnSingleTapConfirmed=true;
			return super.onSingleTapConfirmed(e);
		}
		@Override
		public boolean onSingleTapUp(MotionEvent e) {
			Log.d("DEBUGMSG","onSingleTapUp");
			CircleView.this.ifOnSingleTapUp=true;
			return super.onSingleTapUp(e);
		}
	}
}



最后一个是画图的刷帧线程
package opq.movcircle;

import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class CircleViewDrawThread extends Thread {
	CircleView circleView;
	SurfaceHolder surfaceHolder;
	int sleepSpan = 10;//睡眠的毫秒数
	public boolean flag;//是否刷帧
	public CircleViewDrawThread(CircleView circleView,SurfaceHolder surfaceHolder){
		this.circleView=circleView;
		this.surfaceHolder=surfaceHolder;
	}
	public CircleViewDrawThread(){}
	@Override
	public void run() {
		
		Canvas c;//画布
		while(flag){
			
			c = null;
			try {
			    c = surfaceHolder.lockCanvas(null);
			    synchronized (this.surfaceHolder) {
			    	try{
			    		circleView.onDraw(c);
			    	}
			    	catch(Exception e){}
			    }
			} finally {
			    if (c != null) {
			        surfaceHolder.unlockCanvasAndPost(c);
			    }
			}
			try{
				Thread.sleep(sleepSpan);//睡眠
			}
			catch(Exception e){
				e.printStackTrace();
			}
			
		}
	}
	public void setFlag(boolean flag){
		this.flag=flag;
	}
}


0
2
分享到:
评论
1 楼 zhanhao 2011-07-08  
最好有个源码!

相关推荐

    android输入法手势程序源码

    在Android平台上,手势输入是一...总的来说,这份源码是Android手势输入的一个实际示例,通过研究和实践,开发者不仅可以了解手势识别的基本原理,还能掌握如何在Android应用中实现这一功能,从而提升应用的用户体验。

    Android-安卓手势解锁示例-手势解锁-自定义手势-安卓手势

    总结,Android手势解锁示例主要涉及了Android手势识别的基础知识,包括`GestureOverlayView`、`GestureLibrary`和`GestureDetector`的使用,以及手势的存储与恢复策略。通过理解这些知识点,开发者可以为自己的应用...

    android 图片手势缩放

    这个示例着重于实现Android图片的手势缩放功能,通过监听用户的触摸事件来调整图片的大小,提供流畅且直观的操作体验。 手势识别在Android中主要依赖于`GestureDetector`和`ScaleGestureDetector`这两个类。`...

    Android ViewPager 小示例

    在这个“Android ViewPager小示例”中,我们将深入探讨ViewPager的基本用法、功能以及如何与其他组件结合使用,以实现更丰富的交互体验。 首先,ViewPager是Android Support Library的一部分,它支持API 11及以上...

    android创建手势识别示例代码

    GestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区。GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net 1.1、...

    Android 滑动手势监听例子源码.zip

    通过这个源码示例,开发者可以学习到如何在Android应用中监听和响应滑动手势,从而实现更丰富的用户交互。此外,还可以根据需求扩展手势识别,例如使用ScaleGestureDetector来识别缩放手势,或使用...

    简单的Android手势检测库示例 - Java - 下载.zip

    这个"简单的Android手势检测库示例 - Java - 下载.zip"包含了一个使用Java编写的简单手势检测库,名为gesto-master,它可以帮助开发者轻松地集成手势识别功能到他们的应用程序中。下面我们将详细探讨Android手势检测...

    android手势demo

    "android手势demo"是一个针对Android平台的手势操作示例项目,它包含了源代码和详细的使用步骤,旨在帮助开发者理解和实现各种手势识别功能。以下是对这个项目的详细解读。 首先,我们要理解Android手势的基本概念...

    android 之GestureOverlayView手势识别

    `Gesture`类是Android手势识别的核心,它包含了手势的所有轨迹点信息。通过`Gesture`对象,我们可以使用`GestureLibrary`和`GestureDetector`进行手势的识别和比较。`GestureLibrary`用于存储预定义的手势,而`...

    Android通过手势实现的缩放处理

    在Android开发中,手势识别是实现用户交互的关键技术之一,特别是在移动设备上,手势操作能够提供直观、便捷的用户体验。本篇文章将详细讲解如何在Android应用中通过手势识别实现缩放处理,主要聚焦于多点触摸...

    android 2个手势缩放ImageView源码及Demo

    在Android开发中,手势识别是实现用户交互的关键技术之一,特别是在图像处理和UI设计中。本文将详细探讨如何使用手势缩放ImageView,并提供两个不同的示例:一个被称为"效果较好",另一个是"效果一般"。 首先,让...

    Android手势解锁

    综上所述,Android手势解锁的实现涉及到了触摸事件的监听、手势路径的记录、存储以及匹配等多个环节。通过学习和理解这一示例代码,开发者可以构建自己的手势解锁功能,为用户提供更加便捷和安全的解锁体验。

    Android 随手势进行3D旋转的源码.zip

    在这个示例中,开发者可能使用了GestureDetector的onTouchEvent()方法来捕获用户的手势动作。用户的手势通常通过MotionEvent来传递,包含ACTION_DOWN(手指触摸屏幕)、ACTION_MOVE(手指在屏幕上移动)和ACTION_UP...

    android手势密码

    下面我们将深入探讨Android手势密码的功能、实现原理以及相关的开发知识。 ### 1. 功能特性 手势密码的主要特性包括: - **自定义性**:用户可以自由绘制一个由4个或更多连接的点组成的手势路径,作为解锁密码。 ...

    Android界面设计示例

    "Android界面设计示例"提供了一系列PS(Photoshop)文档,旨在帮助设计师们理解和创建出色的Android用户界面。以下是对这个主题的详细阐述: 1. **Android UI原则**:Android界面设计遵循Material Design指南,这是...

    android 简单的手势切换视图示例.doc

    android 简单的手势切换视图示例 android的home screen,可以通过手指的向左拖动和向右拖动,切换屏幕视图。 这样做的好处是用户体验比较好,比向下滚屏或者使用tab切换视图。 在自己的代码中要用到这个动作效果...

    实现捏合手势的示例

    实现捏合手势的类, 介绍GestureDetector,和 SimpleOnScaleGestureListener 使用详情请参见: http://blog.csdn.net/aduovip/article/details/8050564

    android手势及多点触控事件学习资料

    一、Android手势识别 1. 基本手势:Android系统提供了多种内置手势,如单击、长按、滑动(Slide)、双击(Tap)等。这些手势可以通过`MotionEvent`类来捕获和处理。`MotionEvent`包含了关于触摸事件的所有信息,如...

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

    这个"Android触屏手势识别Demo源码"提供了一个实际的示例,帮助开发者理解如何在Android应用中实现手势识别功能。下面将详细讲解Android触屏手势的基础知识、手势识别的实现原理以及如何通过源码学习和应用这些知识...

    Android手势密码解锁示例及相关操作 - Java - 下载.zip

    Android手势密码解锁示例及相关操作 - Java - 下载.zip

Global site tag (gtag.js) - Google Analytics