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


声明:本文转载自https://my.oschina.net/DragonMatrix/blog/1572249,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

近期项目中需要处理按键长按事件,所以使用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);     }

 

三、总结

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

本文发表于2017年11月12日 20:34
(c)注:本文转载自https://my.oschina.net/DragonMatrix/blog/1572249,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2592 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

万稳万当,不如一默。任何一句话,你不说出来便是那句话的主人,你说了出来,便是那句话的奴隶。

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1