tohodog / QSVideoPlayer

安卓视频播放器AndroidVideoplayer,架构设计优良功能丰富,支持多种解码,支持设置比例,浮窗,倍速,静音等
Apache License 2.0
301 stars 63 forks source link

请问如何通过按键快进快退? #2

Closed Pengchengistaken closed 7 years ago

Pengchengistaken commented 7 years ago

该问题是怎么引起的?

如果做在电视应用上,如何使用按键来进行快进快退呢? 我用onKeyDown,发现在进度条不显示的时候能够快进快退。但是如果进度条显示的时候,则会每500ms回到开始按按键的地方。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Logger.d("onKeyDown, keyCode is " + keyCode);
        int position = playerView.getPosition();
        Logger.d("onKeyDown, playerView.getPosition() is " + position);
        switch (keyCode){
            case KeyEvent.KEYCODE_ENTER:
            case KeyEvent.KEYCODE_DPAD_CENTER:
                if (playerView.isPlaying()){
                    playerView.pause();
                }else{
                    playerView.play();
                }
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                position += UNITDURATIONMS; //UNITDURATIONMS = 5000
                Logger.d("onKeyDown seekTo " + position);
                playerView.seekTo(position);
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                if (position <= UNITDURATIONMS){
                    position = 0;
                }else {
                    position -= UNITDURATIONMS;
                }
                Logger.d("onKeyDown seekTo " + position);
                playerView.seekTo(position);
                break;
            default:
                break;
        }
        return super.onKeyDown(keyCode, event);
    }

重现步骤

增加左右方向键的监听

报错信息

在seekbar显示的时候无法快进快退

tohodog commented 7 years ago

你好,因为QSVideoViewHelp内部有个handler会定时更新seekbar,外部滑动调节进度的时候需要自己调用停止一下,调节完毕再启动... 262-279行代码 问题关闭是解决了吧- -

Pengchengistaken commented 7 years ago

谢谢解答,我今天早上看了下代码,发现你说的这个地方。 我原来直接用seekTo,应该用seekBar的setProgress,感谢!

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d("onKey", "onKeyDown, keyCode is " + keyCode);
        int progress = seekBar.getProgress();
        switch (keyCode){
            case KeyEvent.KEYCODE_ENTER:
            case KeyEvent.KEYCODE_DPAD_CENTER:
                if (isPlaying()){
                    pause();
                }else{
                    play();
                }
                return false;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                onStartTrackingTouch(seekBar);

                //DELTA is 5 for example
                if(progress + 5 > seekBar.getMax())  {
                    seekBar.setProgress(0);
                }else {
                    seekBar.setProgress(progress + 5);
                }
                return false;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                onStartTrackingTouch(seekBar);
                progress = seekBar.getProgress();
                if(progress - 5 < 0)  {
                    seekBar.setProgress(0);
                } else  {
                    seekBar.setProgress(progress - 5);
                }
                return false;
            default:
                break;
        }
        return false;
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d(" onKey", "onKeyUp, keyCode is " + keyCode);
        switch (keyCode){
            case KeyEvent.KEYCODE_DPAD_RIGHT:
            case KeyEvent.KEYCODE_DPAD_LEFT:
                onStopTrackingTouch(seekBar);
                return false;
            default:
                break;
        }
        return false;
    }