一、界面相关:视频播放器的加载
1、播放视频主界面是个activity
public class VideoPlayerActivity extends Activity
2、在其onCreate函数里:setContentView(R.layout.main);加载主布局文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:background="@color/background"> <!-- 播放主界面 --> <com.guo.videoplayer.VideoView android:id="@+id/vv" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
布局文件就一个视频播放视图,该视图是我们自己定义的一个SurfaceView类
3、视频播放视图
public class VideoView extends SurfaceView implements MediaPlayerControl
该类中定义媒体播放器:private MediaPlayer mMediaPlayer
该播放器在视图创建时通过mMediaPlayer.setDisplay(mSurfaceHolder),这个函数绑定该SurfaceView
实际上是在主界面activity创建时,加载了视图播放器
二、界面相关:播放控制界面的加载
1、播放控制界面用弹出窗口:PopupWindow:弹出窗口可以浮动显示在播放界面的上层,而不影响主界面的焦点。
2、播放控制界面的布局文件:略
3、让布局文件显示在弹出窗口中:在onCreate函数中实现下面代码:
//根据布局文件膨胀出控制条视图 controlView = getLayoutInflater().inflate(R.layout.controler, null); //用布局文件视图构造弹出窗口:使控制视图在弹出窗口中显示 controler = new PopupWindow(controlView);
4、显示播放控制弹出窗口:
//第一个参数是弹窗父控件的布局;
//第二个参数是在父控件的位置如左,右,上部,下部等
//第三、四个参数是X、y方向的偏移量
//这个函数类型AlsertDialog的show()函数
controler.showAtLocation(vv, Gravity.BOTTOM, 0, 0);
//更新控制的位置
controler.update(0, 0, screenWidth, controlHeight);
三、界面相关:播放控制界面的显示和隐藏
1、程序启动后的显示,在onCreate函数中实现:程序启动后,因为要有很多前期准备工作,所以不能直接显示。
2、添加一个空闲处理器,当空闲的时候处理,代码如下:
//每个主线程中内含一个Looper,和它的消息对了Looper.myQueue(); //添加idle处理器:在Looper的消息队列里添加一个空闲处理器,当空闲的时候处理 Looper.myQueue().addIdleHandler(new IdleHandler() { //当前消息队列中的所体验消息都执行完调用 @Override public boolean queueIdle() { //显示播放控制窗口 if(controler != null && vv.isShown()) { controler.showAtLocation(vv, Gravity.BOTTOM, 0, 0); controler.update(0, 0, screenWidth, controlHeight); } //返回false将使该handler调用一次之后被移除 return false; } });
3、如果程序启动后,没有播放界面则不会隐藏,当播放时,则延迟隐藏控制栏,使播放界面更友好
流程如下:
1:点击播放列表,执行//显示视频播放列表
VideoPlayerActivity.this.startActivityForResult(intent, 0);
2:在onActivityResult函数里接收结果,然后调用VideoView的setVideoPath函数,该函数调用 打开视频函数openVideo();
3:openVideo():进行播放器的初始化工作:创建该视频播放器、设置播放器在该视图中显示、设置它的监听器
执行流程:mMediaPlayer.prepareAsync()-》调用MediaPlayer.OnPreparedListener监听器的onPrepared函数-》
调用VideoView这个类的mOnPreparedListener.onPrepared(mMediaPlayer);这个类的监听函数在主activity类中定义:
//当媒体文件载入时调用 vv.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { //设置视频播放尺寸 setVideoScale(SCREEN_DEFAULT); //默认尺寸播放 isFullScreen = false; if(isControllerShow) { showController(); } //获得视频持续时间 int i = vv.getDuration(); seekBar.setMax(i); i/=1000; int minute = i/60; int hour = minute/60; int second = i%60; minute %= 60; //显示视频持续时间 durationTextView.setText(String.format("%02d:%02d:%02d", hour,minute,second)); vv.start(); bn3.setImageResource(R.drawable.pause); hideControllerDelay(); myHandler.sendEmptyMessage(PROGRESS_CHANGED); } });
对播放界面进行一些初始化工作,并通过hideControllerDelay();函数隐藏播放控制界面。
4、以后的各种显示、隐藏的控制只要调用showController()和hideControllerDelay()这两个函数即可。
四、主activity:VideoPlayerActivity如果获取VideoView视图里的媒体播放器mMediaPlayer的监听事件的:
在VideoView里的mMediaPlayer事件监听器:
//设置准备监听器 mMediaPlayer.setOnPreparedListener(mPreparedListener); //设置播放完成监听器 mMediaPlayer.setOnCompletionListener(mCompletionListener); //媒体播放器准备监听器:当播放器调用了prepare()或prepareAsync()函数时调用 MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mOnPreparedListener.onPrepared(mMediaPlayer); } }; //播放完毕监听器时调用 MediaPlayer.OnCompletionListener mCompletionListener new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { mOnCompletionListener.onCompletion(mMediaPlayer); } };
//设置准备监听器 public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) { mOnPreparedListener = l; } //设置播放完毕监听器 public void setOnCompletionListener(OnCompletionListener l) { mOnCompletionListener = l; }
在VideoPlayerActivity里的onCreate函数里调用VidioView的设置监听器函数,设置VidioView里的mOnCompletionListener的onPrepared函数
//当媒体文件载入时调用 vv.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer arg0) { } } ) //视频播放完毕调用 vv.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer arg0) { } })
总结调用过程:媒体播放器的监听函数-》调应mOnCompletionListener对象的监听函数-》主activity实现mOnCompletionListener对象的监听函数
五、主activity对媒体播放器的控制
1、activity->VideoView->mMediaPlayer
2、函数控制:主activity通过调用VideoView函数,VideoView函数调用mMediaPlayer实现控制。
3、监听器控制:主activity通过调用VideoView函数设置事件监听器函数如:mOnCompletionListener对象的监听函数,而这个监听器函数,在VideoView的mMediaPlayer的监听函数里调用。