2

我需要将触摸事件捕获到MediaController进度滑块,以便MediaPlayer在手指从滑块上抬起之前不会发生更新。

[也许我的情况很独特:我正在播放每个“程序”都有多个“堆栈”的流媒体视频。直到前一个堆栈完成后才会加载下一个堆栈。滑块需要代表所有堆栈的持续时间,而“拇指”的进度需要代表总持续时间。这很容易通过覆盖getBufferPercentage(),getCurrentPosition()和]的getDuration()方法来完成MediaPlayerControl

更成问题的是沿着时间线来回“擦洗”(移动拇指)。如果它导致数据源在每次移动时都出现set多次seekTo,那么事情很快就会陷入困境并崩溃。如果 MediaPlayer 在用户完成擦洗之前不执行任何操作会更好。

正如其他人所写,是的,最好编写我自己的 MediaController 实现。但是为什么要重做所有这些工作呢?我尝试扩展 MediaController,但很快就变得复杂了。我只是想捕捉到滑块的触摸事件!

4

1 回答 1

15

一个能够获得 MediaController 元素的句柄:

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

然后在搜索栏上设置一个监听器,这将需要你实现它的三个公共方法:

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
    }
});

注意事项:这不会在您擦洗时更新当前位置,即左侧 TextView 时间值。(我有一个非常了不起的方法来做到这一点,这个边距太小而无法包含)。

于 2012-07-19T19:42:31.167 回答