600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > MediaPlayer 音乐播放器进度条

MediaPlayer 音乐播放器进度条

时间:2022-02-26 07:17:34

相关推荐

MediaPlayer 音乐播放器进度条

今天学渣研究了一下使用MediaPlayer播放音乐时添加进度条,进度条现在用的是android自带的seekbar,后期会跟换UI的,在之前能够播放音乐的基础上,现在添加的主要功能有两个:

1实时显示播放进度

2手动调节播放进度

现在学渣新建了一个项目来进行测试,后期会和之前博客介绍的滑动页面进行整合,估计会在service建好后整合,敬请期待。。。。

好了先上效果图:

关于使用进度条的基本原理很简单,用到了几个参数:

1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),不过要注意getDuration()的使用状态,在这篇博客中介绍了MediaPlayer的各个状态,大家可以去看看。

2 进度条的长度:android里进度条的长度默认应该是100,单位不详,没影响

3 当前进度:对于歌曲而言,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条而言,是在进度条中所占的比例。主要是对这两个进行转化。

两个功能:

1由于进度需要实时更新,因此在系统中用一个线程对UI线程发消息(每隔100毫秒),在UI线程中用Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进而计算seekbar对应的位置,对seekbar及时进行更新。

2对于手动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()监听滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,用MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。

具体代码如下:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

public class MainActivity extends Activity {

MediaPlayer mediaPlayer; SeekBar seekBar; //本地歌曲的路径 String path = "/storage/sdcard1/Music/浪漫满屋.mp3"; //处理进度条更新 Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg){ switch (msg.what){ case 0: //更新进度 int position = mediaPlayer.getCurrentPosition(); int time = mediaPlayer.getDuration(); int max = seekBar.getMax(); seekBar.setProgress(position*max/time); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); //初始化播放按钮 Button playButton = (Button)findViewById(R.id.playButton); playButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show(); play(); } }); //初始化暂停按钮 Button pauseButton = (Button)findViewById(R.id.pauseButton);pauseButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub pause(); } }); seekBar = (SeekBar)findViewById(R.id.seekbar); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { //手动调节进度 // TODO Auto-generated method stub int dest = seekBar.getProgress(); int time = mediaPlayer.getDuration(); int max = seekBar.getMax(); mediaPlayer.seekTo(time*dest/max); } @Override public void onStartTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { // TODO Auto-generated method stub } }); }

//初始化音乐播放

void init(){

//进入Idle

mediaPlayer = new MediaPlayer();

try {

//初始化

mediaPlayer.setDataSource(path);

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // prepare 通过异步的方式装载媒体资源 mediaPlayer.prepareAsync(); //后台线程发送消息进行更新进度条 final int milliseconds = 100; new Thread(){ @Override public void run(){ while(true){ try { sleep(milliseconds); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } mHandler.sendEmptyMessage(0); } } }.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //测试播放音乐 void play(){mediaPlayer.start(); } //暂停音乐private void pause() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } //activity 退出时,停止播放音乐,释放资源 @Override protected void onDestroy() { // 在activity结束的时候回收资源 if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } super.onDestroy();

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。