控制MediaController进度滑块

时间:2012-07-19 19:42:31

标签: android video-streaming media-player mediacontroller

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

[也许我的情况很独特:我正在为每个“程序”播放多个“堆栈”的流媒体视频。在上一个堆栈完成之前,不会加载下一个堆栈。滑块需要表示所有堆栈的持续时间,“拇指”的进度需要表示总持续时间。这可以通过覆盖getBufferPercentage()]的getCurrentPosition()getDuration()MediaPlayerControl方法轻松完成

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

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

1 个答案:

答案 0 :(得分: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时间值。 (我有一个非常了不起的方法,这个边距太小而无法容纳)。