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

fm.jiecao:jiecaovideoplayer:x.x.x

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

仅优化关键代码部分,源码:

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实例添加到视图中,并设置相关参数和动画。
  • 异常处理: 捕获并处理可能的异常,以确保程序的健壮性。

代码:

public void startWindowFullscreen() {Log.i(TAG, "startWindowFullscreen " + " [" + this.hashCode() + "] ");// 隐藏支持的ActionBarhideSupportActionBar(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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多无人机--强化学习

这个是我对于我的大创项目的构思&#xff0c;随着时间逐渐更新 项目概要 我们的项目平台来自挑战杯揭绑挂帅的无人机对抗项目&#xff0c;但是在由于时间原因&#xff0c;并未考虑强化学习&#xff0c;所以现在通过大创项目来弥补遗憾 我们项目分为三部分&#xff0c;分为虚…

Python----Python高级(并发编程:进程Process,多进程,进程间通信,进程同步,进程池)

一、进程Process 拥有自己独立的堆和栈&#xff0c;既不共享堆&#xff0c;也不共享栈&#xff0c;进程由操作系统调度&#xff1b;进程切换需要的资源很最大&#xff0c;效率低。 对于操作系统来说&#xff0c;一个任务就是一个进程&#xff08;Process&#xff09;&#xff…

在Mapbox GL JS中“line-pattern”的使用详解

在Mapbox GL JS中&#xff0c;line-pattern 是一种用于在地图上绘制带有图案的线条的样式属性。通过 line-pattern&#xff0c;你可以使用自定义的图像作为线条的图案&#xff0c;而不是使用纯色或渐变。 1. 基本概念 line-pattern: 该属性允许你指定一个图像作为线条的图案。…

C++ Primer 算术运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【大数据技术】本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …

MyBatis-Plus笔记-快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

Maven jar 包下载失败问题处理

Maven jar 包下载失败问题处理 1.配置好国内的Maven源2.重新下载3. 其他问题 1.配置好国内的Maven源 打开⾃⼰的 Idea 检测 Maven 的配置是否正确&#xff0c;正确的配置如下图所示&#xff1a; 检查项⼀共有两个&#xff1a; 确认右边的两个勾已经选中&#xff0c;如果没有请…

2.5学习

misc buuctf-假如给我三天光明 下载附件后得到了一个压缩包和一个图片&#xff0c;压缩包为加密压缩包&#xff0c;需要解出密码&#xff0c;然后注意到这个图片并非简单的一个封面&#xff0c;在下方还有诸多点&#xff0c;有黑有灰。经过搜索&#xff0c;发现这是盲文通过与…

java进阶1——JVM

java进阶——JVM 1、JVM概述 作用 Java 虚拟机就是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对 应平台上的机器码指令行&#xff0c;每一条 java 指令&#xff0c;java 虚拟机中都有详细定义&#xff0c;如怎么取操 作数&#xff0c…

搭建集成开发环境PyCharm

1.下载安装Python&#xff08;建议下载并安装3.9.x&#xff09; https://www.python.org/downloads/windows/ 要注意勾选“Add Python 3.9 to PATH”复选框&#xff0c;表示将Python的路径增加到环境变量中 2.安装集成开发环境Pycharm http://www.jetbrains.com/pycharm/…

《redis4.0 通信模块源码分析(一)》

【redis导读】redis作为一款高性能的内存数据库&#xff0c;面试服务端开发&#xff0c;redis是绕不开的话题&#xff0c;如果想提升自己的网络编程的水平和技巧&#xff0c;redis这款优秀的开源软件是很值得大家去分析和研究的。 笔者从大学毕业一直有分析redis源码的想法&…

开源安全一站式构建!开启企业开源治理新篇章

在如今信息技术日新月异、飞速发展的数字化时代&#xff0c;开源技术如同一股强劲的东风&#xff0c;为企业创新注入了源源不断的活力&#xff0c;然而&#xff0c;正如一枚硬币有正反两面&#xff0c;开源技术的广泛应用亦伴随着不容忽视的挑战。安全风险如影随形&#xff0c;…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;实现图片的批量处理。 传统上&#xff0c;批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理&#xff0c;而现在有了AI的辅助&#xff0c;我们可以轻松生成PS脚本&#xff0c;实现自动化处…

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的: 组合逻辑: always @(…

2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;一级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 点击下列哪个按钮&#xff0c;可以将红框处的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 标…

C++【深入 STL--list 之 迭代器与反向迭代器】

接前面的手撕list(上)文章&#xff0c;由于本人对于list的了解再一次加深。本文再次对list进行深入的分析与实现。旨在再一次梳理思路&#xff0c;修炼代码内功。 1、list 基础架构 list底层为双向带头循环链表&#xff0c;问题是如何来搭建这个list类。可以进行下面的考虑&am…

如何打开vscode系统用户全局配置的settings.json

&#x1f4cc; settings.json 的作用 settings.json 是 Visual Studio Code&#xff08;VS Code&#xff09; 的用户配置文件&#xff0c;它存储了 编辑器的个性化设置&#xff0c;包括界面布局、代码格式化、扩展插件、快捷键等&#xff0c;是用户全局配置&#xff08;影响所有…

STM32 ADC模数转换器

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0~3.3V&#xff0…

(2025,LLM,下一 token 预测,扩散微调,L2D,推理增强,可扩展计算)从大语言模型到扩散微调

Large Language Models to Diffusion Finetuning 目录 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微调的高斯扩散 3.2 架构 4. 主要实验结果 5. 结论 1. 概述 本文提出了一种新的微调方法——LM to Diffusion (L2D)&#xff0c;旨在赋予预训练的大语言模型&#xff08;…

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…