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的监听函数里调用。