Android播放器进度条改造实践:将句级音频列表映射为秒级时间轴,实现更精准的播放控制。本文详细介绍实现思路与关键代码。

传统音频播放器以秒为单位显示和控制进度,而当前系统采用句为单位显示。由于句子长度差异,导致进度条显示不连贯。需要改造为秒级控制,实现与传统播放器一致的体验。
//数据获取时累加时长
if (list.get(i) != null && list.get(i).getDuration() > 0) {
map.put("duration", list.get(i).getDuration() + "");
long duration = list.get(i).getDuration();
ConstantFd.durations.add(duration);
ConstantFd.totalDuration = ConstantFd.totalDuration + duration;
}
//全局变量定义
public static List durations = new ArrayList<>();
public static long totalDuration = 0;
public static int currentPoi = 0;
private static long process = 0;
private static long max = 0;
private final Handler mHandler_tb = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 0:
max = ConstantFd.totalDuration;
long cur = apm.getMediaPlayer().getCurrentPosition();
process = cur + getPlayProcess();
PoiToUIMsg.sendMsg(process, max);
if(ConstantFd.isplay){
mHandler_tb.sendEmptyMessageDelayed(0, 1000);
}
break;
}
return true;
}
});
mBinding.seekbar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
PoiToPlayMsg.sendMsg(seekBar.getProgress());
}
});
private void seekToSpecificPoi(long totalPositionMs) {
long accumulatedDuration = 0l;
for (int i = 0; i < ConstantFd.durations.size(); i++) {
long duration = ConstantFd.durations.get(i);
if (totalPositionMs < accumulatedDuration + duration) {
readAdapter.mPosSomeTime = i;
break;
}
accumulatedDuration += duration;
}
}
private void seekToSpecificPosition(long totalPositionMs) {
process = totalPositionMs;
long accumulatedDuration = 0l;
for (int i = 0; i < ConstantFd.durations.size(); i++) {
long duration = ConstantFd.durations.get(i);
if (totalPositionMs < accumulatedDuration + duration) {
long relativePositionMs = totalPositionMs - accumulatedDuration;
apm.getMediaPlayer().seekTo(relativePositionMs);
break;
}
accumulatedDuration += duration;
}
}
包含两种遍历逻辑:
示例:总时长9500ms(句0:3000ms + 句1:2500ms + 句2:4000ms)
用户拖动到5500ms:
- 句0累计3000ms
- 句1累计5500ms
- 落在句1内偏移2500ms
边界情况:拖动到9500ms时直接定位最后一句
通过改造实现了句级音频列表到秒级时间轴的精准映射,使Android播放器获得与传统音乐播放器一致的用户体验。核心在于秒句转换算法和实时进度更新机制的设计实现。