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;
}

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值