- 浏览: 61659 次
- 性别:
- 来自: 长沙
最新评论
-
天空下午茶:
xuexi le
MotionEvent对象分析 -
qkyh1225:
以及是否支持触屏
Html5手机游戏引擎简介 -
qkyh1225:
兄弟,有没有研究HTML5游戏开发引擎——melonjs啊?它 ...
Html5手机游戏引擎简介 -
fancy4u:
有空多交流...我也在研究html5 游戏框架 QQ 406 ...
LimeJS---Html5游戏引擎简介(续)--基本特性介绍
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
CircleView中的代码,这个类继承自surface类,专门用来画图的类和实现俩接口:
最后一个是画图的刷帧线程
大概思想就是创建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; } }
发表评论
-
【Android基础】Activity的启动模式(android:launchMode)(转)
2012-01-03 01:03 1223在android里,有4种activity的启动模式,分 ... -
Android使用ListView构造复杂页面,并响应点击事件,通过intent跳转代码(转)
2012-01-03 00:59 10306基础知识及注意事项:1、在需要使用Intent跳转到其他 ... -
Button控件的简介
2012-01-03 00:51 3274vandroid:text属性 在按钮上显示文字 ... -
Android成长之路-音乐播放器的实现(转)
2012-01-03 00:23 1483strings.xml view plain ... -
MotionEvent对象分析
2012-01-02 23:59 18177当用户触摸屏幕时将创建一个MotionEvent对象。Mo ... -
Handler: 主线程如何通知子线程(转)
2012-01-02 19:44 2082在 android 中,不可以在子线程中更新 UI ... -
android开机启动服务
2011-06-29 20:54 1507这是个很简单的过程,这个不像pc机得开机启动,要有精确的内存地 ... -
handler里面
2011-06-29 11:05 1164android的Handler使用很简单不用再这里就不再赘述了 ... -
android的Activity生命周期续集
2011-06-28 17:38 1294为手机做的游戏肯定会对来电监听,短信监听,当然,此时此刻监听来 ... -
手势事件
2011-06-28 15:17 2android的手机主要以触摸 ... -
Activity生命周期和对话框
2011-05-07 11:48 4069在一个Android程序中至少得有一个Activity,And ... -
HelloWorldAndroid几个控件
2011-05-06 10:02 945对于程序员来说学习任 ... -
磨刀霍霍向猪羊Android第一次
2011-05-05 00:11 1069古人有云,工欲善其事必先利其器。开发Android程序,如果没 ...
相关推荐
安卓手势解锁示例-手势解锁-自定义手势-安卓手势
GestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区。GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net 1.1、...
android滑动手势解锁示例代码,类似与支付宝手势解锁。
简单的Android手势检测库示例 - Java - 下载.zip
android 简单的手势切换视图示例 android的home screen,可以通过手指的向左拖动和向右拖动,切换屏幕视图。 这样做的好处是用户体验比较好,比向下滚屏或者使用tab切换视图。 在自己的代码中要用到这个动作效果...
实现捏合手势的类, 介绍GestureDetector,和 SimpleOnScaleGestureListener 使用详情请参见: http://blog.csdn.net/aduovip/article/details/8050564
Android手势密码解锁示例及相关操作 - Java - 下载.zip
一个Android应用程序示例,实现多点触摸的手势识别。
适用于Android的轻手势解锁视图示例 - Java - 下载.zip
Android手势缩放屏幕内容的示例,那个小圆圈可以用手势来放大、缩小,两个手指向外张,就放大了球球,向里收,就缩小了球球,这个手势控制的例子量不是很实用呢?可以用到很多的Android APP中呢。最常见的就是放大...
Android中使用手势实现侧滑菜单的示例代码.pdf 学习资料 复习资料 教学资源
Android多点触控变换手势检测器示例 - Java - 下载.zip
Android系统滑动手势侦测方法介绍,有代码示例
主要介绍了Android手势操作方法,包含了针对上、下、左、右等方向的判断,具有一定参考借鉴价值,需要的朋友可以参考下
该示例较完整的演示了FingerGesture的手势事件,附APK文件,可以作为unity插件FingerGesture和NGUI的综合使用
主要介绍了AndroidStudio手势识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了android使用手势识别的方法,介绍了单击触摸屏触发的事件和双击事件的使用等方法,大家参考使用吧
主要介绍了android开发中为activity增加左右手势识别示例,需要的朋友可以参考下
主要为大家详细介绍了Android实现手势滑动,左滑和右滑效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下