通過Chronometer和SeekBar實現一個簡單的音頻播放進度展示功能,感覺使用Chronometer計時方便很多,之前還是使用TextView來進行展示,現在感覺low了許多,關於Chronometer的用法請參照官方介紹
效果圖
代碼的實現
通過Timer定時器設置每隔一秒獲取當前MediaPlayer的播放進度然後賦值給SeekBar。給Chronometer設置初始值SystemClock.elapsedRealtime()
表示啓動以來經過的毫秒,再將SeekBar的實時進度賦值給Chronometer。
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener{
private SeekBar seekBar;
private MediaPlayer player;
private Timer timer;
private Chronometer time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar = ((SeekBar) findViewById(R.id.seekBar));
time = ((Chronometer) findViewById(R.id.chronometer));
timer = new Timer();
player = MediaPlayer.create(this, Uri.parse("http://video.ooowin.com/video/2017/3/22/f6dd8bf9219a04e5ed4a58394b6f7279.mp3"));
seekBar.setMax(player.getDuration());
time.setBase(SystemClock.elapsedRealtime());
timer.schedule(task,0,1000);
seekBar.setOnSeekBarChangeListener(this);
}
TimerTask task = new TimerTask() {
@Override
public void run() {
seekBar.setProgress(player.getCurrentPosition());
}
};
public void onPlay(View view) {
switch (view.getId()) {
//開始
case R.id.start:
if(!player.isPlaying())player.start();
break;
//暫停
case R.id.pause:
if(player.isPlaying())player.pause();
break;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
time.setBase(SystemClock.elapsedRealtime() - seekBar.getProgress());
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//拖動進度條
player.seekTo(seekBar.getProgress());
}
@Override
protected void onDestroy() {
super.onDestroy();
//關閉定時器
timer.cancel();
//停止播放,釋放資源
if (player.isPlaying()) {
player.stop();
player.release();
}
}
}
結束語
怎麼樣,一個很簡單的例子。因爲佈局很簡單所以就不貼出佈局代碼了,需要的話可以看下源碼,沒有什麼難點,就是感覺它們仨配合起來挺好的,哈哈。