本文主要针对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函数
- <span style="font-size:16px;">public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //获取控件实例
- //R.raw.thriller为res/raw文件夹下的音频文件的id
- mPlayer = MediaPlayer.create(this, R.raw.thriller);
- tvStatus = (TextView)findViewById(R.id.tvStatus);
- mController = (MediaController)findViewById(R.id.mController);
- //设定MediaPlayer实例的状态与属性
- if (mPlayer.isPlaying()) {
- mPlayer.reset();//重置为初始状态
- }
- //设定结束及出错处理的监听器
- mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
- public void onCompletion(MediaPlayer mp) {
- // TODO Auto-generated method stub
- mp.release();
- }
- });
- mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
- public boolean onError(MediaPlayer mp, int what, int extra) {
- // TODO Auto-generated method stub
- mp.release();
- return false;
- }
- });
- //构造MediaPlayerControl的实例,用以将MediaPlayer和MediaController的实例 //联系起来。主要需要实现start()等几个方法。
- MediaController.MediaPlayerControl mpc = new MediaController.MediaPlayerControl() {
- public void start() {
- // TODO Auto-generated method stub
- try {
- if(mPlayer != null)
- {
- mPlayer.stop();
- }
- mPlayer.prepare();
- mPlayer.start();
- tvStatus.setText("音乐播放中...");
- } catch (Exception e) {
- tvStatus.setText("播放发生异常...");
- e.printStackTrace();
- }
- }
- public void seekTo(int pos) {
- // TODO Auto-generated method stub
- mPlayer.seekTo(pos);
- }
- public void pause() {
- // TODO Auto-generated method stub
- mPlayer.pause();
- }
- public boolean isPlaying() {
- // TODO Auto-generated method stub
- return mPlayer.isPlaying();
- }
- public int getDuration() {
- // TODO Auto-generated method stub
- return mPlayer.getDuration();
- }
- public int getCurrentPosition() {
- // TODO Auto-generated method stub
- return mPlayer.getCurrentPosition();
- }
- public int getBufferPercentage() {
- // TODO Auto-generated method stub
- int length = mPlayer.getDuration();
- if(length != 0)
- return mPlayer.getCurrentPosition()*100/mPlayer.getDuration();
- else return 0;
- }
- public boolean canSeekForward() {
- // TODO Auto-generated method stub
- return false;
- }
- public boolean canSeekBackward() {
- // TODO Auto-generated method stub
- return false;
- }
- public boolean canPause() {
- // TODO Auto-generated method stub
- return true;
- }
- };
- //设定MediaController实例所控制的MediaPlayer
- mController.setMediaPlayer(mpc);
- //将该实例定位在主界面
- mController.setAnchorView(findViewById(R.layout.main));
- });
- }
- </span>
main.xml的内容
- <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tvStatus"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello" />
- <MediaController
- android:id="@+id/mController"
- android:layout_width="match_parent"
- android:layout_height="76dp">
- </MediaController>
- </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
-
顶