seekbar在Mediaplayer中的应用

seekbar就是通常的进度条,在播放器中使用seekbar可以随时查看带播放进度,还可以自己控制进度,因而seekbar是Mediaplayer播放的一个很好的工具, 这里写了个简单功能的实例。
        
    xml 文件内容很简单:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.   xmlns:android="http://schemas.android.com/apk/res/android"
  4.   android:orientation="vertical"
  5.   android:layout_width="match_parent"
  6.   android:layout_height="match_parent">
  7. <TextView
  8. android:id="@+id/mediaplay_textview"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:text="Hello!">

  12. </TextView>
  13. <SeekBar
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:id="@+id/mediaplay_seekbar">
  17. </SeekBar>
  18. <LinearLayout
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:orientation="horizontal">
  22. <ImageButton
  23. android:id="@+id/start"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:src="@drawable/h"
  27. ></ImageButton>
  28. <ImageButton
  29. android:id="@+id/pause"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:src="@drawable/i"
  33. ></ImageButton>
  34. <ImageButton
  35. android:id="@+id/stop"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:src="@drawable/j"
  39. ></ImageButton>
  40. </LinearLayout>
  41. </LinearLayout>
java代码实现

新建一个空的MediaPlayer对象用于播放,一个TextView作为播放状态的文本显示。
并设置两个bool变量作为状态标志,线程控制需要的Hnadler对象
  1. private MediaPlayer mediaplayer=null;
  2.         private TextView textview;
  3.         private SeekBar seekbar;
  4.         boolean isPaused=false,isChanging=false;
  5.         private Handler handler;

  新建三个imagebutton 用于实现播放控制操作并设置监听:开始,暂停,停止。
  1.              mediaplayer=new MediaPlayer();
  2.              textview=(TextView)findViewById(R.id.mediaplay_textview);
  3.              seekbar=(SeekBar)findViewById(R.id.mediaplay_seekbar);
  4.             ImageButton start=(ImageButton)findViewById(R.id.start);
  5.             ImageButton pause=(ImageButton)findViewById(R.id.pause);
  6.             ImageButton stop=(ImageButton)findViewById(R.id.stop);
  7.             seekbar.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  8.             start.setOnClickListener(this);
  9.             pause.setOnClickListener(this);
  10.             stop.setOnClickListener(this);
  11.         }
相应按钮点击事件:
  1. public void onClick(View v) {
  2.             // TODO Auto-generated method stub
  3.             switch (v.getId()){
  4.             case R.id.start:
  5.                     if(mediaplayer!=null){
  6.                        Log.v("1","1");
  7.                         mediaplayer.reset();
  8. //将media重置,回到未初始话状态
  9.                         mediaplayer=MediaPlayer.create(this, R.raw.g);
  10. //初始化media对象,g为多媒体资源(mp3)
  11.                    }else{
  12.                         mediaplayer=MediaPlayer.create(this, R.raw.g);                    
  13.                         Log.v("2","2");
  14.                     }
  15.                     seekbar.setMax(mediaplayer.getDuration());
  16. //将进度条的最大长度设置为媒体文件的播放时间,便于两者的同步
  17. //                    m.setAudioStreamType(AudioManager.STREAM_MUSIC); 
  18. //         m.setDisplay(surfaceHolder);//设置屏幕 
  19.                     mediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
  20. //设置媒体资源播放完毕监听  
  21.                         @Override
  22.                         public void onCompletion(MediaPlayer arg0) {
  23.                             // TODO Auto-generated method stub
  24. //                            mediaplayer.release();
  25.                             Log.v("complete","complete");
  26.                             textview.setText("play end!");
  27.                         }
  28.                     });
  29.                     mediaplayer.start();
  30.                     textview.setText("playing..");
  31.                 break;
  32.             case R.id.pause:
  33.                 if(mediaplayer!=null){
  34.                     if(isPaused){
  35.                         mediaplayer.start();
  36.                         isPaused=false;
  37.                         textview.setText("playing..");
  38.                     }else{
  39.                         mediaplayer.pause();
  40.                         isPaused=true;
  41.                         textview.setText("pausing..");
  42.                     }
  43.                 }
  44.                 break;
  45.             case R.id.stop:
  46.                 if(mediaplayer!=null){
  47.                     mediaplayer.stop();
  48.                     isPaused=false;
  49.                     textview.setText("stop");
  50.                     Log.v("3","3");
  51.                 }
  52.                 break;
  53.             }
初始化线程对象
  1.            handler=new Handler(){
  2.                 public void handleMessage(Message msg){
  3.                     seekbar.setProgress(mediaplayer.getCurrentPosition());
  4.                 }
  5.             };//实现消息传递
  6.             DelayThread delaythread=new DelayThread(100);
  7.             delaythread.start();
新建一个类实现Seekbar的事件监听:
  1. class SeekBarChangeEvent implements OnSeekBarChangeListener{
  2.             @Override
  3.             public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
  4.                 // TODO Auto-generated method stub  
  5.             }
  6.             @Override
  7.             public void onStartTrackingTouch(SeekBar arg0) {
  8. //开始拖动进度条
  9.                 // TODO Auto-generated method stub
  10.                  isChanging=true; 
  11.             }
  12.             @Override
  13.             public void onStopTrackingTouch(SeekBar arg0) {
  14. //停止拖动进度条
  15.                 // TODO Auto-generated method stub
  16.                 mediaplayer.seekTo(arg0.getProgress());
  17. //将media进度设置为当前seekbar的进度
  18.                 isChanging=false; 
  19.             }
  20.       }

因为MediaPlayer类没有播放进度的回调方法,所以需要设置一个线程实现实时刷新:
  1.       class DelayThread extends Thread{
  2.             int milliseconds;
  3.             public DelayThread(int i){
  4.                 milliseconds=i;
  5.             }
  6.             public void run(){
  7.                 while(true){
  8.                     try {
  9.                         sleep(milliseconds);
  10. //设置音乐进度读取频率
  11.                     } catch (InterruptedException e) {
  12.                         // TODO Auto-generated catch block
  13.                         e.printStackTrace();
  14.                     }
  15.                     handler.sendEmptyMessage(0);
  16.                 }
  17.             }
  18.             
  19.         }
以上就完成了一个简单的带进度控制的播放程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值