我需要将触摸事件捕捉到MediaController
进度滑块,以便在手指抬起滑块之前不会发生对MediaPlayer
的更新。
[也许我的情况很独特:我正在为每个“程序”播放多个“堆栈”的流媒体视频。在上一个堆栈完成之前,不会加载下一个堆栈。滑块需要表示所有堆栈的持续时间,“拇指”的进度需要表示总持续时间。这可以通过覆盖getBufferPercentage()
]的getCurrentPosition()
,getDuration()
和MediaPlayerControl
方法轻松完成
更有问题的是沿着时间线来回“擦洗”(移动拇指)。如果它导致数据源多次set
以及每次移动seekTo
,那么事情会很快陷入困境并崩溃。如果MediaPlayer在用户完成擦除之前没有执行任何操作会更好。
正如其他人所写,是的,最好编写我自己的MediaController实现。但为什么要重做所有这些工作呢?我尝试扩展MediaController,但很快就变得复杂了。我只是想把触摸事件抓到滑块!
答案 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时间值。 (我有一个非常了不起的方法,这个边距太小而无法容纳)。