fm.jiecao:jiecaovideoplayer:x.x.x
优化fm.jiecao.jcvideoplayer_lib中视频横竖屏自动适配原视频方案:
仅优化关键代码部分,源码:
java
public void startWindowFullscreen() {
Log.i(TAG, "startWindowFullscreen " + " [" + this.hashCode() + "] ");
hideSupportActionBar(getContext());
ViewGroup vp = (ViewGroup) (JCUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
View old = vp.findViewById(FULLSCREEN_ID);
if (old != null) {
vp.removeView(old);
}
if (textureViewContainer.getChildCount() > 0) {
textureViewContainer.removeAllViews();
}
try {
Constructor<JCVideoPlayer> constructor = (Constructor<JCVideoPlayer>) JCVideoPlayer.this.getClass().getConstructor(Context.class);
JCVideoPlayer jcVideoPlayer = constructor.newInstance(getContext());
jcVideoPlayer.setId(FULLSCREEN_ID);
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int w = wm.getDefaultDisplay().getWidth();
int h = wm.getDefaultDisplay().getHeight();
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(h, w);
lp.setMargins((w - h) / 2, -(w - h) / 2, 0, 0);
vp.addView(jcVideoPlayer, lp);
jcVideoPlayer.setShowDownloadIcon(showDownloadIcon);
if (needSumWatchVideoTimerLongFlag) {
jcVideoPlayer.setUpWithWatchVideoTime(videoId, url, JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);
} else {
jcVideoPlayer.setUp(videoId, url, JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);
}
jcVideoPlayer.setUiWitStateAndScreen(currentState);
jcVideoPlayer.addTextureView();
jcVideoPlayer.setRotation(90);
final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.start_fullscreen);
jcVideoPlayer.setAnimation(ra);
JCVideoPlayerManager.setLastListener(this);
JCVideoPlayerManager.setListener(jcVideoPlayer);
downloadButton.setVisibility(showDownloadIcon ? VISIBLE : View.GONE);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
优化
详细方案
- 隐藏ActionBar: 在全屏模式下,通常需要隐藏ActionBar以提供更好的观看体验。
- 获取屏幕尺寸: 使用WindowManager获取当前设备的屏幕宽度和高度。
- 视频尺寸判断: 通过JCMediaManager获取当前视频的宽度和高度,并根据宽高比决定是横屏还是竖屏。
- 布局参数设置: 根据视频的宽高比,设置FrameLayout.LayoutParams以确保视频在全屏模式下正确显示。
- 旋转设置: 如果视频宽度大于高度,旋转90度以横屏显示;否则,保持竖屏。
- 添加视图和设置参数: 将新的JCVideoPlayer实例添加到视图中,并设置相关参数和动画。
- 异常处理: 捕获并处理可能的异常,以确保程序的健壮性。
代码:
java
public void startWindowFullscreen() {
Log.i(TAG, "startWindowFullscreen " + " [" + this.hashCode() + "] ");
// 隐藏支持的ActionBar
hideSupportActionBar(getContext());
// 获取当前Activity的内容视图
ViewGroup vp = (ViewGroup) (JCUtils.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
View old = vp.findViewById(FULLSCREEN_ID);
if (old != null) {
vp.removeView(old); // 移除旧的全屏视图
}
if (textureViewContainer.getChildCount() > 0) {
textureViewContainer.removeAllViews(); // 移除TextureView容器中的所有视图
}
try {
// 通过反射创建一个新的JCVideoPlayer实例
Constructor<JCVideoPlayer> constructor = (Constructor<JCVideoPlayer>) JCVideoPlayer.this.getClass().getConstructor(Context.class);
JCVideoPlayer jcVideoPlayer = constructor.newInstance(getContext());
jcVideoPlayer.setId(FULLSCREEN_ID); // 设置全屏视图的ID
// 获取屏幕的宽度和高度
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int screenWidth = wm.getDefaultDisplay().getWidth();
int screenHeight = wm.getDefaultDisplay().getHeight();
// 获取视频的宽度和高度
int videoWidth = JCMediaManager.instance().currentVideoWidth;
int videoHeight = JCMediaManager.instance().currentVideoHeight;
FrameLayout.LayoutParams lp;
// 根据视频的宽高比设置布局参数和旋转角度
if (videoWidth > videoHeight) {
// 如果视频宽度大于高度,设置为横屏
lp = new FrameLayout.LayoutParams(screenHeight, screenWidth);
lp.setMargins((screenWidth - screenHeight) / 2, -(screenWidth - screenHeight) / 2, 0, 0);
jcVideoPlayer.setRotation(90); // 旋转90度
} else {
// 如果视频高度大于或等于宽度,设置为竖屏
lp = new FrameLayout.LayoutParams(screenWidth, screenHeight);
jcVideoPlayer.setRotation(0); // 不旋转
}
// 将新的JCVideoPlayer添加到视图中
vp.addView(jcVideoPlayer, lp);
// 设置视频播放器的参数
jcVideoPlayer.setUp(url, JCVideoPlayerStandard.SCREEN_WINDOW_FULLSCREEN, objects);
jcVideoPlayer.setUiWitStateAndScreen(currentState); // 设置UI状态和屏幕
jcVideoPlayer.addTextureView(); // 添加TextureView
// 设置全屏动画
final Animation ra = AnimationUtils.loadAnimation(getContext(), R.anim.start_fullscreen);
jcVideoPlayer.setAnimation(ra);
// 设置视频播放器管理器的监听器
JCVideoPlayerManager.setLastListener(this);
JCVideoPlayerManager.setListener(jcVideoPlayer);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}