关于处理按键长按不用onKeyLongPress的另一种解决方案

近期项目中需要处理按键长按事件,所以使用onKeyLongPress()进行了处理,但同时自己也发现了另一种处理长按的方式。首先来介绍一下使用onKeyLongPress()的相关方法。

一、onKeyLongPress使用

1.在onKeyDown()方法中,使用event.startTracking() 
使用onKeyLongPress必须使用event.startTracking() 
先定义一个布尔值,表示是否长按

private boolean isLongPress = false;

然后在onKeyDown()方法中

        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            if (event.getRepeatCount() == 0) {
                event.startTracking();
                isLongPress = false;
                Toast.makeText(this, "key单击", Toast.LENGTH_SHORT).show();
            }
            else {
                isLongPress = true;
            }
            return true;
        }

2.在onKeyLongPress()中写自己需要的代码

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            isLongPress = true;
            Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
            return true;
        }
        return super.onKeyLongPress(keyCode, event);
    }

3.在onKeyUp()方法中对冲突进行处理

        if (keyCode == KeyEvent.KEYCODE_ENTER){
            if (isLongPress){
                isLongPress = false;
                return true;
            }
            Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
        }

不解决冲突的话,会让onKeyLongPress()和onKeyUp()都响应。

二、不用onKeyLongPress()的方法

这种方法是自己想出来的另一种方法,如有雷同,纯属巧合。 
1.首先定义一个long值,记录按键抬起时的时间,因为在测试中发现,onKeyDown事件在长按过程中是在不断执行的,所以event.getRepeatCount()才能不断更新记录,但是onKeyUp中的event.getRepeatCount()在长按过程中不会有任何变化,因为只在长按最后抬起时才触发一次,所以每次抬起时打印出来的都是0,所以我们在onKeyUp中判断long值的时间。

private long longTime = 0;

2.接下来在onKeyDown()中判断更新时间

    if (keyCode == KeyEvent.KEYCODE_ENTER){
        if (event.getRepeatCount() == 0){
            longTime = System.currentTimeMillis();
        }
        return true;
    }

前面说过的在onKeyDown()中长按时event.getRepeatCount()会一直更新,所以要判断只在按下来的第一次时更新时间。

3.接下来在onKeyUp()中判断执行自己的代码 
当抬起时的时间大于自己设置的时间后,就可以去执行自己想要执行的长按事件了。

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d("抬起", event.getRepeatCount()+" " + (System.currentTimeMillis() - longTime));
        if (keyCode == KeyEvent.KEYCODE_ENTER){
            //毫秒数可以自己指定
            if (System.currentTimeMillis() - longTime < 500){
                Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
                return true;
            }
            else {
                Toast.makeText(this, "key终于", Toast.LENGTH_SHORT).show();
            }
        }
        return super.onKeyUp(keyCode, event);
    }

 

三、总结

上面两种方法都可以实现处理按键长按的效果,但有所区别,第一种方法,系统会判断在长按一定时间后,就直接执行你想要执行的长按代码,即使你还没有从按键上抬起松开;第二种方法,只有在你抬起松开按键后,才会去根据你指定的毫秒数来判断,是否执行长按方法。两种方法具体怎么使用,大家可以根据自己的情况自行判断,谢谢观赏。

    原文作者:移动开发
    原文地址: https://my.oschina.net/DragonMatrix/blog/1572249
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞