项目中需要做一个视频播放模块,大体是用的七牛播放器android端SDK+SurfaceView+自定义MediaController。这里就只介绍自己写的mediaController。下面正式开始。
三步走:重点内容
1. 定义MediaControllerInterface接口
2. 自定义controller类,实现MediaControllerInterface接口
3. 创建播放界面实现MediaControllerInterface.MediaControl接口
第一步:先上代码:
public interface MediaControllerInterface {
void show();//显示
void show(int time);//显示
void hide();//隐藏
boolean isShowing();//是否显示
void setCollected(boolean isCollected);//是否被收藏
void setSeekBarEnabled(boolean var1);
void isCompleted();//设置已经播放完成了
void To_change_screen(int w,int h);//改变宽高
interface MediaControl {
void VideoStart();//开始播放
void VideoResume();//继续播放
void VideoPause();//暂停
void VideoStop();//停止
long getDuration();//视频时长
long getCurrentPosition();//当前播放进度
void seekTo(long var1);//拖动进度
boolean isPlaying();//是否正在播放
boolean isPausing();//是否是暂停状态
boolean isFullScreen();//判断是否是全屏状态
void toCollect();//收藏按钮
void actionForFullScreen();//收藏按钮
}
}
这个MediaControllerInterface 接口类主要是为了让controller类实现,与实现了MediaControllerInterface.MediaControl的播放界面类,进行回调操作。
重点在MediaControl接口,需要播放界面实现当中的方法,与controller上面的组件进行绑定。
第二步:部分代码如下:
初始化代码:
//初始化
private View initView() {
View view = LayoutInflater.from(mContext).inflate(R.layout.view_controller, null);
ll_top = (LinearLayout) view.findViewById(R.id.ll_top);
iv_collect = (ImageView) view.findViewById(R.id.iv_collect);
iv_center_play = (ImageView) view.findViewById(R.id.iv_center_play);
ll_bottom = (LinearLayout) view.findViewById(R.id.ll_bottom);
iv_play = (ImageView) view.findViewById(R.id.iv_play);
tv_watched = (TextView) view.findViewById(R.id.tv_watched);
sb_progress = (SeekBar) view.findViewById(R.id.sb_progress);
tv_total = (TextView) view.findViewById(R.id.tv_total);
iv_fullscreen = (ImageView) view.findViewById(R.id.iv_fullscreen);
iv_collect.setOnClickListener(mCollectListener);//收藏监听
iv_center_play.setOnClickListener(mPlayListener);//播放按钮的监听
iv_play.setOnClickListener(mPlayListener);//播放按钮的监听
iv_fullscreen.setOnClickListener(mFullListener);//全屏按钮的监听
sb_progress.setMax((int) SEEKBAR_MAX);
//进度条拖动的监听
sb_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mPlayer.seekTo(mDuration * seekBar.getProgress() / SEEKBAR_MAX);
}
});
return view;
}
与播放器的绑定:
//添加控制绑定
public void setControl(MediaControllerInterface.MediaControl mPlayer) {
this.mPlayer = mPlayer;
}
public void setAnchorView(ViewGroup view) {
mAnchorVGroup = view;
FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
mAnchorVGroup.getWidth(),
mAnchorVGroup.getHeight()
);
removeAllViews();
controllerView = initView();
mAnchorVGroup.addView(controllerView, frameParams);
}
controller触摸事件的获取:目的是为了防止用户操作焦点在controller上时,controller不会消失。
//当触摸事件处于控制器上的时候,显示控制器,不让其消失
@Override
public boolean onTouchEvent(MotionEvent event) {
show(sDefaultTimeout);
return false;
}
//当触摸事件处于控制器上的时候,显示控制器,不让其消失
@Override
public boolean onTrackballEvent(MotionEvent ev) {
show(sDefaultTimeout);
return false;
}