View实现单击双击和触屏移动

版权声明:本文为博主abcnull的原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcnull/article/details/80428571

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,若是那么它就是单击事件了。

猜你喜欢

转载自blog.csdn.net/abcnull/article/details/80428571
今日推荐