优化fm.jiecao.jcvideoplayer_lib中视频横竖屏自动适配原视频方案

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();
    }
}
相关推荐
我喜欢就喜欢3 小时前
# MVStudy 交互式视频培训系统:让每一段视频都能“与人对话“
音视频
EasyDSS7 小时前
连锁扩张管控难?一套视频会议/直播/点播/集群对讲EasyDSS音视频云平台打通门店全流程数字化
网络·音视频·easydss
阿明副业观察8 小时前
2026年免费AI视频生成工具功能深度解析:有无水印、中文语音及商业用途考量
大数据·人工智能·ai作画·aigc·音视频·ai写作
国产化创客11 小时前
ESP32音频/语音技术(4)AudioTools 库及转发播放程序分析
物联网·音视频·esp32
martindelophy11 小时前
浏览器视频导出太慢怎么优化?一次 WebCodecs 实践:8 分钟视频耗时降低 31%
性能优化·音视频·优化
Dovis(誓平步青云)12 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
开开心心就好16 小时前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
Dovis(誓平步青云)17 小时前
现场问题先关闭还是先验收,建筑任务怎样处理依赖
前端·javascript·数据库·mysql·音视频
原子延迟17 小时前
视频还没出画面怎么判断是不是坏了
图像处理·人工智能·计算机视觉·音视频
小猴子爱上树18 小时前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商翻译工具
python·音视频