MediaControllr使用简介

 本文主要针对MediaController控件进行简单的介绍,并以MP3播放器作为示例进行展示。如有偏颇,请多指教。

 

简介

         Android.widget.MediaController是一个与MediaPlayer相匹配的android控件。它主要集合了一些对于媒体播放器来说非常经典的控制接口,包括“播放(Play)/暂停(Pause)”,“倒带(Rewind”,“快进(Fast Forward)”,“前一个(previous)”和“下一个(next)”与进度滑动器(progress slider)。如下图:




该类的部分公有方法:

public boolean dispatchKeyEvent (KeyEventevent)

在焦点路径上分发按钮事件到下一个视图。该路径从视图树的顶端遍历到当前获得焦点的视图。如果当前视图已获得焦点,就分发给自身。否则,就分发到下一个节点的焦点路径上。这个方法也可以激发任何一个按键消息监听器。

  参数           被分发的事件

  返回值  如果这个事件被处理了返回true,否则返回false。

public void hide ()

从屏幕中移除控制器。

public boolean isShowing ()

(译者注:判断媒体控制器是否处于可见状态。)

public void onFinishInflate ()

XML文件加载视图完成时调用。这个函数在加载的最后阶段被调用,所有的子视图已经被添加。即使子类重写了onFinishInflate方法,也应该始终确保调用父类方法,以便我们调用。

public boolean onTouchEvent (MotionEventevent)

实现这个方法来处理触摸屏幕引发的事件。

  参数                   动作事件

  返回值  如果这个事件被处理了返回true,否则返回false。

public boolean onTrackballEvent(MotionEvent ev)

实现这个方法处理轨迹球的动作事件,轨迹球相对运动的最后一个事件能用MotionEvent.getX() 和MotionEvent.getY()函数获取。这些都是标准化的,用1表示用户按下一个DPAD按键。(因此他们将经常使用小数值表示,为轨迹球提供更多的的细微运动信息)(译者注:DPAD按键事件: KeyEvent.KEYCODE_DPAD_CENTER(居中)、KeyEvent.KEYCODE_DPAD_DOWN(向下)、KeyEvent.KEYCODE_DPAD_LEFT(向左)、KeyEvent.KEYCODE_DPAD_RIGHT(向右)、KeyEvent.KEYCODE_DPAD_UP(向上)作比较。分别表示居中、下移、左移、右移、上移的操作。相关链接:onTrackBallEvent方法简介)

  参数                   动作事件

  返回值              如果这个事件被处理了返回true,否则返回false。

public void setAnchorView (View view)

设置这个控制器绑定(anchor/锚)到一个视图上。例如可以是一个VideoView对象,或者是你的activity的主视图。

  参数                   将视图来绑定控制器时可见

public void setEnabled (boolean enabled)

设置视图对象的有效状态。这也可以改变子类的有效状态。

  参数                   如果要让这个视图对象可用就设置为true,否则设置为false。

public void setMediaPlayer(MediaController.MediaPlayerControl player)

(译者注:把这个媒体控制器设置到VideoView对象上。)

    (笔者注:网上的示例多是依照上述将MediaController用于视频控制,本文中以音频播放为目的,经摸索后实现对MediaPlayer的直接控制。)

public void setPrevNextListeners (View.OnClickListenernext, View.OnClickListener prev)

(译者注:设置"previous"和"next"按钮的监听器函数。)

          (笔者注:无论英文版或中文版API中都说该函数被调用前,Previous和Next均处于隐藏状态,但是本文的示例中却无法将其隐藏。原因尚不明。)

public void show (int timeout)

在屏幕上显示这个控制器。它将在闲置’超时 (timeout)’毫秒到达后自动消失。

  参数                   这个参数以毫秒为单位。如果设置为0将一直显示到调用                                                    hide()函数为止。

public void show ()

在屏幕上显示这个控制器。它将在3秒以后自动消失。

 

 

示例代码

         在了解的基础上,让我们通过代码进行验证。以下是示例的主要代码

主界面activity的OnCreate函数


[java]  view plain  copy
  1. <span style="font-size:16px;">public void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.main);  
  4.         //获取控件实例  
  5.         //R.raw.thriller为res/raw文件夹下的音频文件的id  
  6.         mPlayer = MediaPlayer.create(this, R.raw.thriller);  
  7.         tvStatus = (TextView)findViewById(R.id.tvStatus);   
  8.         mController = (MediaController)findViewById(R.id.mController);  
  9.   
  10.   
  11.         //设定MediaPlayer实例的状态与属性  
  12.         if (mPlayer.isPlaying()) {  
  13.   
  14.             mPlayer.reset();//重置为初始状态  
  15.         }  
  16.   
  17.         //设定结束及出错处理的监听器  
  18.         mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
  19.               
  20.             public void onCompletion(MediaPlayer mp) {  
  21.                 // TODO Auto-generated method stub  
  22.                 mp.release();  
  23.             }  
  24.         });  
  25.         mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {  
  26.             public boolean onError(MediaPlayer mp, int what, int extra) {  
  27.                 // TODO Auto-generated method stub  
  28.                 mp.release();  
  29.                 return false;  
  30.             }  
  31.         });  
  32.   
  33.         //构造MediaPlayerControl的实例,用以将MediaPlayer和MediaController的实例         //联系起来。主要需要实现start()等几个方法。  
  34.         MediaController.MediaPlayerControl mpc = new MediaController.MediaPlayerControl() {  
  35.               
  36.             public void start() {  
  37.                 // TODO Auto-generated method stub  
  38.                 try {         
  39.                      if(mPlayer != null)    
  40.                         {    
  41.                          mPlayer.stop();    
  42.                         }        
  43.                      mPlayer.prepare();    
  44.                      mPlayer.start();    
  45.                      tvStatus.setText("音乐播放中...");    
  46.                     } catch (Exception e) {    
  47.                         tvStatus.setText("播放发生异常...");    
  48.                         e.printStackTrace();    
  49.                     }   
  50.                   
  51.             }  
  52.               
  53.             public void seekTo(int pos) {  
  54.                 // TODO Auto-generated method stub  
  55.                 mPlayer.seekTo(pos);  
  56.                   
  57.             }  
  58.               
  59.             public void pause() {  
  60.                 // TODO Auto-generated method stub  
  61.                 mPlayer.pause();  
  62.             }  
  63.               
  64.             public boolean isPlaying() {  
  65.                 // TODO Auto-generated method stub  
  66.                 return mPlayer.isPlaying();  
  67.             }  
  68.               
  69.             public int getDuration() {  
  70.                 // TODO Auto-generated method stub  
  71.                 return mPlayer.getDuration();  
  72.             }  
  73.               
  74.             public int getCurrentPosition() {  
  75.                 // TODO Auto-generated method stub  
  76.                 return mPlayer.getCurrentPosition();  
  77.             }  
  78.               
  79.             public int getBufferPercentage() {  
  80.                 // TODO Auto-generated method stub  
  81.                 int length = mPlayer.getDuration();  
  82.                 if(length != 0)  
  83.                     return mPlayer.getCurrentPosition()*100/mPlayer.getDuration();  
  84.                 else return 0;  
  85.             }  
  86.               
  87.             public boolean canSeekForward() {  
  88.                 // TODO Auto-generated method stub  
  89.                 return false;  
  90.             }  
  91.               
  92.             public boolean canSeekBackward() {  
  93.                 // TODO Auto-generated method stub  
  94.                 return false;  
  95.             }  
  96.               
  97.             public boolean canPause() {  
  98.                 // TODO Auto-generated method stub  
  99.                 return true;  
  100.             }  
  101.         };  
  102.       
  103.         //设定MediaController实例所控制的MediaPlayer  
  104.         mController.setMediaPlayer(mpc);  
  105.         //将该实例定位在主界面  
  106.         mController.setAnchorView(findViewById(R.layout.main));  
  107.           
  108.         });  
  109.     }  
  110. </span>  


main.xml的内容


[html]  view plain  copy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.     <TextView  
  7.         android:id="@+id/tvStatus"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/hello" />  
  11.     <MediaController  
  12.         android:id="@+id/mController"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="76dp">  
  15.     </MediaController>   
  16. </LinearLayout></span>  


参考资料

    这里感谢网上共享各类资源与知识的前辈,以下是参考到的资料与博文:

http://www.cnblogs.com/wanqieddy/archive/2011/08/16/2140660.html

http://aijiawang-126-com.iteye.com/blog/611250

http://www.oschina.net/question/221735_35484?sort=time


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值