我需要捕捉到MediaController进度滑块的触摸事件,以便在手指离开滑块之前不会更新MediaPlayer
[也许我的情况是独一无二的:我正在播放流媒体视频,每个“程序”有多个“堆栈”。下一个堆栈在前一个堆栈完成之前不会加载。滑块需要表示所有堆栈的持续时间,“拇指”的进度需要表示总持续时间。这可以通过重写getBufferPercentage()getCurrentPosition()getDuration()方法轻松完成。
更麻烦的是“擦洗”(移动拇指)在时间线上来回移动。如果它导致数据源多次MediaPlayerControl并且每次移动都有一个set,那么事情很快就会陷入困境并崩溃。在用户完成清理之前,最好让mediaplayer不执行任何操作。
正如其他人所写的,是的,最好编写我自己的mediacontroller实现。但为什么要重做这些工作呢?我试图扩展mediacontroller,但很快就变得复杂起来。我只想抓住滑杆的触控事件!

最佳答案

一个可以获得mediacontroller元素的句柄:

final int topContainerId1 = getResources().getIdentifier("mediacontroller_progress", "id", "android");
final SeekBar seekbar = (SeekBar) mController.findViewById(topContainerId1);

然后在seekbar上设置一个侦听器,这将要求您实现它的三个公共方法:
seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // Log.i("TAG", "#### onProgressChanged: " + progress);
        // update current position here
        }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // Log.i("TAG", "#### onStartTrackingTouch");
        // this tells the controller to stay visible while user scrubs
        mController.show(3600000);
        // if it is possible, pause the video
        if (playerState == MPState.Started || playerState == MPState.Paused) {
            mediaPlayer.pause();
            playerState = MPState.Paused;
        }
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        int seekValue = seekBar.getProgress();
        int newMinutes = Math.round((float)getTotalDuration() * (float)seekValue / (float)seekBar.getMax());
        // Log.i("TAG", "#### onStopTrackingTouch: " + newMinutes);
        mController.show(3000); // = sDefaultTimeout, hide in 3 seconds
    }
});

Caveats:
这不是在您拖动时更新当前位置,即左侧textview时间值。(我有一个非常了不起的方法来做到这一点,但这一点太小了,无法控制)。

关于android - 控制MediaController进度滑块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11568123/

10-12 03:41