我需要捕捉到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/