View实现单击双击和触屏移动
作者:互联网
我们知道常见的有View、SurfaceView、GLSurfaceView游戏开发框架,View可以做一些简单的游戏,SurfaceView做一些稍微复杂一点存在多种线程实现的游戏,GLSurfaceView制作一些3D的游戏。我们做一些简单的小游戏用View就足够了,但是我们会发现View触屏可以监听按下、弹起和触摸事件,双击事件什么的似乎没有直接提供,下面代码会实现触屏移动和双击事件。
/*
* 在View开发框架下你要重写一下触屏事件onTouchEvent(MotionEvent event),
* 其中的MotionEvent event可以得到在View框架下原始的触屏动作,
* 我们要做的是,把原始的触屏动作换为自定义触屏动作,
* 然后根据不同自定义的触屏动作来执行不同的方法,
* 这个转换为自定义触屏动作的过程可以封装成一个方法,之后在onTouchEvent()中调用即可
*/
//重写触屏方法
@Override
public boolean onTouchEvent(MotionEvent even{
//通过调用customTouchType方法,得到我们自定义的事件类型
int touchType = customTouchType(event);
//若自定义触屏事件是触屏移动
if(touchType == TOUCH_MOVE) {
//当发生触屏移动事件,执行某方法
}
//若自定义触屏事件为双击事件
else if(touchType == TOUCH_DOUBLE_CLICK){
//当发生双击事件,执行某方法
}
}
//合成自定义的事件类型
private int customTouchType(MotionEvent event){
//要返回的自定义事件类型值
int touchType = -1;
//得到原始触屏事件动作
int action = event.getAction();
//若发生触屏移动原始动作
if(action == MotionEvent.ACTION_MOVE){
//得到当前时刻与上一次按下时刻时间差
long deltaTime = System.currentTimeMillis() - touchDownTime;
//只有当抬起和按下时间差大于200ms才被认定为自定义触屏事件
if(deltaTime > singleClickDurationTime){
//自定义触屏移动事件
touchType = TOUCH_MOVE;
}
}
//若发生按下原始事件
else if(action == MotionEvent.ACTION_DOWN){
//记录下按下时间
touchDownTime = System.currentTimeMillis();
}
//若发生抬起原始事件
else if(action == MotionEvent.ACTION_UP){
//记录下抬起时间
touchUpTime = System.currentTimeMillis();
//抬起按下的时间差
long downUpDurationTime = touchUpTime - touchDownTime;
//若抬起按下时间差小于200ms则表示发生点击事件
if(downUpDurationTime <= singleClickDurationTime){
//计算这次抬起事件距离上次点击的时间差
long twoClickDurationTime = touchUpTime - lastSingleClickTime;
//若两次点击事件时间差小于300ms则表示发生双击事件
if(twoClickDurationTime <= doubleClickDurationTime){
//自定义双击事件
touchType = TOUCH_DOUBLE_CLICK;
//由于已经确定最近的上一次点击事件的类型,可以重置变量
lastSingleClickTime = -1;
touchDownTime = -1;
touchUpTime = -1;
}
//若两次点击事件时间差大于300ms,则之前那次的点击一定是单击,
//而这次触屏点击需要经过300ms后才能判断类型到底是不是双击
else{
//保存本次点击事件时刻
lastSingleClickTime = touchUpTime;
}
}
}
//返回自定义事件类型
return touchType;
}
需要注意的是,以上代码中,有一些自己已经定义的属性,如下:
private static final int TOUCH_MOVE = 1;//自定义单击
private static final int TOUCH_DOUBLE_CLICK = 2;//自定义双击
private static final int singleClickDurationTime = 200;//常量200ms,抬按时间差
private static final int doubleClickDurationTime = 200;//常量300ms,两次点击时间差
private long touchDownTime = -1;//触点按下时间
private long touchUpTIme = -1;//触点抬起时间
private long lastSingleClickTime = -1;//上次发生点击的时刻
上面触屏移动和双击事件实现的代码理解起来不是特别特别难,还需要注意的是,我没有写单击,这是因为,单击事件的检测必须是在每经过300ms才能检测,而不是在每次触摸屏幕后再检测,这是因为,一个点击事件只有经过300ms后才能判定它到底是不是与后面的某个点击构成一个双击事件。由于只要属性lastSingleClickTime还有值,不是初始的-1,就表示最近的之前有一个点击事件还没有被判定,所以在绘制每帧游戏时都要在开头检测这个lastSingleClickTime属性值是否还存在(不为-1),若存在,再看当前时刻与它的差是否大于等于300ms,若是那么它就是单击事件了。
标签:单击,自定义,int,private,事件,View,双击,触屏 来源: https://blog.51cto.com/u_13281972/3003623