欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

关于处理按键长按不用onKeyLongPress的另一种解决方案,,首先来介绍一下使用onK

来源: 开发者 投稿于  被查看 25517 次 评论:170

关于处理按键长按不用onKeyLongPress的另一种解决方案,,首先来介绍一下使用onK


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

三、总结

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


作者:明月春秋

用户评论