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

1实时显示播放进度

2手动调节播放进度

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

好了先上效果图:


关于使用进度条的基本原理非常easy,用到了几个參数

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

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

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

两个功能:

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

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

详细代码例如以下:

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;}                    }  };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();//初始化播放buttonButton playButton = (Button)findViewById(R.id.playButton);playButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show();play();}});//初始化暂停buttonButton pauseButton = (Button)findViewById(R.id.pauseButton);pauseButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubpause();}});    seekBar = (SeekBar)findViewById(R.id.seekbar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//手动调节进度// TODO Auto-generated method stubint dest = seekBar.getProgress();int time = mediaPlayer.getDuration();int max = seekBar.getMax();mediaPlayer.seekTo(time*dest/max);}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {// TODO Auto-generated method stub}});}//初始化音乐播放void init(){//进入IdlemediaPlayer = new MediaPlayer();try {//初始化mediaPlayer.setDataSource(path);    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  // prepare 通过异步的方式装载媒体资源mediaPlayer.prepareAsync();//后台线程发送消息进行更新进度条final int milliseconds = 100;new Thread(){@Overridepublic 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 blocke.printStackTrace();}}//測试播放音乐void play(){mediaPlayer.start();}//暂停音乐       private void pause() {          if (mediaPlayer != null && mediaPlayer.isPlaying()) {              mediaPlayer.pause();          }      }      //activity 退出时,停止播放音乐,释放资源@Overrideprotected void onDestroy() {         // 在activity结束的时候回收资源         if (mediaPlayer != null && mediaPlayer.isPlaying()) {             mediaPlayer.stop();             mediaPlayer.release();             mediaPlayer = null;         }         super.onDestroy();   }@Overridepublic 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. Android(安卓)程序在系统中如何完成启动
  2. Android(安卓)Glide扩展实现图片加载进度条
  3. Android(安卓)系统启动流程解析-从开机到Dalvik VM
  4. android开发实例02:列表字母索引与过滤检索
  5. Android百度语音集成——文字转语音
  6. Android中通过AsyncTask类来制作炫酷进度条的实例教程
  7. Android进度条 多线程登录或下载
  8. Android自定义进度条——圆角横向进度条
  9. Android(安卓)可拖动的进度条:SeekBar之简单使用

随机推荐

  1. android调用输入软键盘回车键跟删除键
  2. Android(安卓)项目导入后真机运行提示:W/d
  3. 安卓selector使用方法
  4. Android属性之build.prop,及property_get/
  5. Android 在 LinearLayout 添加分割线 div
  6. 如何给你的Android 安装文件(APK)瘦身
  7. Android(安卓)给 app默认权限(不弹窗申请
  8. Android 动态logo bootanimation.zip 制
  9. 【EditText】Android设置EditText不可编
  10. View动画