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函数


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));
       	
		});
    }


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


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值