MediaControllr使用简介

来源:互联网 发布:ipad怎么登陆淘宝卖家 编辑:程序博客网 时间:2024/06/05 15:46

作者:孔祥辉

前言

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

 

简介

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




该类的部分公有方法:

public booleandispatchKeyEvent (KeyEventevent)

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

  参数           被分发的事件

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

public voidhide ()

从屏幕中移除控制器。

public booleanisShowing ()

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

public voidonFinishInflate ()

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

public booleanonTouchEvent (MotionEventevent)

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

  参数                   动作事件

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

public booleanonTrackballEvent(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 voidsetEnabled (boolean enabled)

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

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

public voidsetMediaPlayer(MediaController.MediaPlayerControl player)

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

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

public voidsetPrevNextListeners (View.OnClickListenernext, View.OnClickListener prev)

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

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

public voidshow (int timeout)

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

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

public voidshow ()

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

 

 

示例代码

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

主界面activity的OnCreate函数


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 stubmp.release();}});        mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {public boolean onError(MediaPlayer mp, int what, int extra) {// TODO Auto-generated method stubmp.release();return false;}});//构造MediaPlayerControl的实例,用以将MediaPlayer和MediaController的实例//联系起来。主要需要实现start()等几个方法。        MediaController.MediaPlayerControl mpc = new MediaController.MediaPlayerControl() {public void start() {// TODO Auto-generated method stubtry {            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 stubmPlayer.seekTo(pos);}public void pause() {// TODO Auto-generated method stubmPlayer.pause();}public boolean isPlaying() {// TODO Auto-generated method stubreturn mPlayer.isPlaying();}public int getDuration() {// TODO Auto-generated method stubreturn mPlayer.getDuration();}public int getCurrentPosition() {// TODO Auto-generated method stubreturn mPlayer.getCurrentPosition();}public int getBufferPercentage() {// TODO Auto-generated method stubint length = mPlayer.getDuration();if(length != 0)return mPlayer.getCurrentPosition()*100/mPlayer.getDuration();else return 0;}public boolean canSeekForward() {// TODO Auto-generated method stubreturn false;}public boolean canSeekBackward() {// TODO Auto-generated method stubreturn false;}public boolean canPause() {// TODO Auto-generated method stubreturn true;}};    //设定MediaController实例所控制的MediaPlayermController.setMediaPlayer(mpc);//将该实例定位在主界面mController.setAnchorView(findViewById(R.layout.main));       });    }


main.xml的内容


<?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>


参考资料

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

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


原创粉丝点击