扯淡部分
这里的小屏指的是全屏切换到小屏幕
其实上篇博客小屏切换全屏看明白了,其实这个都无所谓看不看,直接切换到小屏的视频输出就好了
public static boolean backPress() {
Log.i(TAG, "backPress");
if (JCVideoPlayerManager.listener() != null) {
return JCVideoPlayerManager.listener().goToOtherListener();
}
return false;
}
这个就是返回的代码。就这几行扯什么淡呢?
backPress作用
backPress方法是静态,开源的大大要求在有视频播放的界面这样复写activity的onBackPressed
@Override
public void onBackPressed() {
if (JCVideoPlayer.backPress()) {
return;
}
super.onBackPressed();
}
这就是返回键的监听,因为全屏模式和小屏模式是同一个activity。如果你不这样重写会导致,全屏下点击返回键全屏会被关掉,小屏所在的activity也会被关闭
这里先扯下backPress方法在不同情况下的处理
1、当没有播放的时候listener肯定为空。返回键交给系统处理
2、当小屏播放的时候,返回键也会交给系统处理。这个为什么等下分析全屏切小屏的时候会说的
3、当全屏的时候,返回键则会应用处理,应用会关掉全屏(也就是全屏切换小屏的逻辑)
4、当代码调用直接进入全屏的时候,也就是没有小屏的时候,会直接关掉播放,但是返回键还是应用处理,不会交给系统
分析全屏切换小屏
从第一段代码中可以看到回调到goToOtherListener,listener就是当前视频输出的 JCVideoPlayer对象
@Override
public boolean goToOtherListener() {//这里这个名字这么写并不对,这是在回退的时候gotoother,如果直接gotoother就不叫这个名字
Log.i(TAG, "goToOtherListener " + " [" + this.hashCode() + "] ");
if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN
|| currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_TINY) {
// if (currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN) {
// final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.quit_fullscreen);
// startAnimation(ra);
// }
onEvent(currentScreen == JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN ?
JCBuriedPoint.ON_QUIT_FULLSCREEN :
JCBuriedPoint.ON_QUIT_TINYSCREEN);
if (JCVideoPlayerManager.lastListener() == null) {//directly fullscreen 如果从小屏幕中点击全屏进来 lastListener必然不为null
JCVideoPlayerManager.listener().onCompletion(); //如果是直接进入全屏状态下 点击小屏按钮后则直接播放完成
showSupportActionBar(getContext());
return true;
}
ViewGroup vp = (ViewGroup) (JCUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
vp.removeView(this);
JCVideoPlayerManager.setListener(JCVideoPlayerManager.lastListener());
JCVideoPlayerManager.setLastListener(null);
JCMediaManager.instance().lastState = currentState;//save state
JCVideoPlayerManager.listener().goBackThisListener();
CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();
return true;
}
return false;
}
这个方法只有在小屏幕也就是右下角小屏播放和全屏的时候才会处理,其他情况下则直接返回false--这个也证明了刚刚说的backPress方法的第二点
跟着的代码是判断lastListener是否为null,如果为null就判断为直接进入全屏没有小屏幕的。
这里稍微说下两个listener。当小屏播放的时候lastListener为null,listener为当前的this,全屏播放为jcVideoPlayer对象lastListener为this。
所以小屏切全屏下lastListener必定不为null,为null则为直接进入全屏
如果是直接进入的全屏则直接设置播放完成
接着也就是全屏切换到小屏的操作,找到屏幕最根view,removeView(jcVideoPlayer)或者this。
接着回调到listener的goBackThisListener方法。这个方法也很好理解只调用了addTextureView