Android 物理按键过快问题

427 阅读1分钟

Android TV开发 物理按键抖动问题

问题描述:

在做Tv开发过程中,要实现选集以及帧预览功能,需要根据按键事件控制试图控制器ControlView的显示隐藏。大概代码如下:
@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (isShowEsp) {//选集
                    cancelActionViewTimer();
                } else if (isShowThumbs) {//快进
                    cancelProgressTimer();
                    cancelThumbsViewTimer();
                }
                break;
            case MotionEvent.ACTION_UP:
                if (isShowEsp) {
                    startDismissActionViewTimer();
                } else if (isShowThumbs) {
                    startDismissThumbsViewTimer();
                }
                break;
        }
        }

但是在快速点按物理键盘的时候,可能会出现上一个ACTION_UP还没有响应,下一个ACTION_UP已经响应了,这就造成了会连续执行了两次cancel然后两次start,然后延迟dismiss对应View视图的task会跟想要的效果有出入(正确的应该是按下取消,弹起开始,结果变成了还在对控制视图进行操作,结果视图dismiss了,尴尬,所以要对物理按键事件进行防抖)。

防抖:

跟touch事件类似,在一定时间内,进行同样的操作,只响应一次:

   long l = System.currentTimeMillis();
        if (mStartTime > 0 && l - mStartTime < 500) {
            //防抖
            return;
        }
        mStartTime = l;