Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35004
  • 博文数量: 4
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-07 21:41
文章分类

全部博文(4)

文章存档

2011年(4)

我的朋友

分类: 嵌入式

2011-03-08 11:10:44

        seekbar就是通常的进度条,在播放器中使用seekbar可以随时查看带播放进度,还可以自己控制进度,因而seekbar是Mediaplayer播放的一个很好的工具, 这里写了个简单功能的实例。
       
   xml文件内容很简单:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.   xmlns: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.         }
以上就完成了一个简单的带进度控制的播放程序。

阅读(12936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~