音乐播放是MediaPlayer这个类控制的,进度条SeekBar可以用来显示播放进度,用户也可以利用SeekBar的滑块来控制音乐的播放。两个按钮一个用来播放歌曲启动线程,另一个取消线程和停止播放歌曲。
SeekBar:
设置滑块的位置方法为:setProgress(int value);
设置最大值的方法为:setMax(int value);
MusicPlayer:
播放音乐方法为:start();
停止音乐播放的方法为:stop();
控制音乐播放位置为:seekTo(int value);
获得音乐长度为:getDuration();
获得现在播放的位置:getCurrentPosition();
Handler:
启动线程:post(Runnable runnable);
取消线程:removeCallbacks(Runnable runnable);
延迟启动线程(time 单位为毫秒):postDelayed(Runnable, int time);
代码如下:
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
public class Test extends Activity {
private Button button1;
private Button button2;
private SeekBar seekBar1;
private MediaPlayer player;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
findView();
setListener();
}
private void init() {
player = MediaPlayer.create(this, R.drawable.example);
}
private void findView() {
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
seekBar1 = (SeekBar)findViewById(R.id.seekbar1);
//获得歌曲的长度并设置成播放进度条的最大值
seekBar1.setMax(player.getDuration());
}
Handler handler = new Handler();
Runnable updateThread = new Runnable(){
public void run() {
//获得歌曲现在播放位置并设置成播放进度条的值
seekBar1.setProgress(player.getCurrentPosition());
//每次延迟100毫秒再启动线程
handler.postDelayed(updateThread, 100);
}
};
private void setListener() {
button1.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0){
player.start();
//启动
handler.post(updateThread);
}
});
button2.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
player.stop();
//取消线程
handler.removeCallbacks(updateThread);
}
});
seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// fromUser判断是用户改变的滑块的值
if(fromUser==true){
player.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
});
}
}
seekBar要绑定setOnSeekBarChangeListener()事件,三个方法第一个是滑块滑动时调用的,第二个是滑动开始滑动时调用的,第三个是滑动停止时调用的。