为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过不会继续更新(保留在初始版本)
每个人对于UI都有不同的理解,而且UI也不是这系列文章的重点,所以我们主要讨论一些常见问题,尽量让大家少踩坑
模式切换
模式主要有单双屏、陀螺仪/触控,以及两者的互相组合,不同的模式对于MVP矩阵的处理不同,还需要考虑应用隐藏到后台时的资源释放/保存问题
一般GL上下文在应用资源不足时会被自动释放,然后就造成了各种各样的异常,还不知道该怎么改好,有一个方法可以让应用在后台也保存GL上下文:
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
glSurfaceView.setPreserveEGLContextOnPause(true);
}
播放进度、视频时长
接口就是MediaPlayer的那些接口,但是实现可能各有不同,代码仅供参考
@Override
public void onCompletion(MediaPlayer mp) {
statusHelper.setPanoStatus(PanoStatus.COMPLETE);
if (playerCallback!=null){
playerCallback.requestFinish();
}
}
public void seekTo(int pos){
if (mMediaPlayer!=null){
PanoStatus panoStatus=statusHelper.getPanoStatus();
if (panoStatus==PanoStatus.PLAYING
|| panoStatus==PanoStatus.PAUSED
|| panoStatus== PanoStatus.PAUSED_BY_USER)
mMediaPlayer.seekTo(pos);
}
}
public int getDuration(){
if (mMediaPlayer!=null){
return mMediaPlayer.getDuration();
}
return 0;
}
public int getCurrentPosition(){
if (mMediaPlayer!=null){
return mMediaPlayer.getCurrentPosition();
}
return 0;
}
进度条自动隐藏
这个算辅助功能吧,不过如果要让用户点一下才隐藏也太不人性化了??
通过设置一个TimerTask
,可以实现一段时间后自动隐藏(使用第三方库或者自己加上淡出动画就更棒了)
public void hide(){
if (!visible) return;
visible=false;
progressToolbar.setVisibility(View.GONE);
controlToolbar.setVisibility(View.GONE);
}
public void show(){
if (visible) return;
visible=true;
progressToolbar.setVisibility(View.VISIBLE);
controlToolbar.setVisibility(View.VISIBLE);
}
public void startHideControllerTimer(){
if (!autoHideController) return;
cancelHideControllerTimer();
hideControllerTimer=new Timer();
hideControllerTimerTask=new HideControllerTimerTask();
hideControllerTimer.schedule(hideControllerTimerTask,2666);
}
public void cancelHideControllerTimer(){
if (hideControllerTimer!=null) {
hideControllerTimer.cancel();
}
if (hideControllerTimerTask!=null) {
hideControllerTimerTask.cancel();
}
}
public class HideControllerTimerTask extends TimerTask{
@Override
public void run() {
((Activity)context).runOnUiThread(new Runnable() {
@Override
public void run() {
hide();
}
});
}
}