优化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();}
}
相关文章:
优化fm.jiecao.jcvideoplayer_lib中视频横竖屏自动适配原视频方案
fm.jiecao:jiecaovideoplayer:x.x.x 优化fm.jiecao.jcvideoplayer_lib中视频横竖屏自动适配原视频方案: 仅优化关键代码部分,源码: public void startWindowFullscreen() {Log.i(TAG, "startWindowFullscreen " " [" …...
aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API
aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容: 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API,之后再接收到了http request之后,redirect到lambda进行执行。…...
物联网的三层架构:感知层、网络层与应用层
物联网(Internet of Things, IoT)作为现代科技的重要组成部分,正在深刻改变我们的生活和工作方式。它将物理世界与数字世界无缝连接,通过智能设备、传感器和网络技术,实现数据的采集、传输和应用。物联网的架构通常分为…...
常用抓包工具tcpdump、Fiddler、Charles、Wireshark 和 Sniffmaster 下载地址
抓包大师官网下载地址 Sniff Master Download - Free TCP and HTTPS Proxy Sniffing Tool, Supports IOS Sniffing Fiddler classic官网下载地址 Download Fiddler Web Debugging Tool for Free by Telerik Fiddler Everywhere官网下载地址 The Ultimate Web Debugging Tool …...
π0开源了且推出自回归版π0-FAST——打造机器人动作专用的高效Tokenizer:比扩散π0的训练速度快5倍但效果相当
前言 过去的半个多月 deepseek火爆全球,我对其的解读也成了整整一个系列 详见《火爆全球的DeepSeek系列模型》,涉及对GRPO、MLA、V3、R1的详尽细致深入的解读 某种意义来讲,deepseek 相当于把大模型的热度 又直接拉起来了——相当于给大模…...
js-对象-JSON
JavaScript自定义对象 JSON 概念: JavaScript Object Notation,JavaScript对象标记法. JSON 是通过JavaScript 对象标记法书写的文本。 由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输. json中属性名(k…...
Houdini subuv制作输出阵列图
在游戏开发中经常需要用到sheet阵列图,并用其制作翻页动画。通过Houdini强大的节点组合可以配合输出subuv阵列图供游戏引擎使用。 本文出处:https://zhuanlan.zhihu.com/p/391796978 博主参考学习并写该文。 1.在obj分类下创建font节点以进行测试&#…...
虚幻基础17:动画蓝图
能帮到你的话,就给个赞吧 😘 文章目录 animation blueprint图表(Graph): 编辑动画逻辑。变量(Variables): 管理动画参数。函数(Functions): 自定义…...
路由器及工作原理与常用路由配置命令详解
一、引言 在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。无论是家庭网络中的多台设备同时上网,还是企业网络中各个部门之间的数据传输和资源共享,都离不开网络设备的支持。路由器作为一种关键的网络设备,在网…...
Windows编程:下载与安装 Visual Studio 2010
本节前言 在写作本节的时候,本来呢,我正在写的专栏,是 MFC 专栏。而 VS2010 和 VS2019,正是 MFC 学习与开发中,可以使用的两款软件。然而呢,如果你去学习 Windows API 知识的话,那么࿰…...
R语言 文本分析 天龙八部
起因, 目的: 前面有人对 “倚天屠龙记” 进行分析,我这里只是进行模仿而已。 完整的文件, 已经绑定了,反正读者可以找一下。 案例背景 小说《天龙八部》是金庸先生所著的武侠小说,也是“射雕三部曲”的前传。全书共50章,字数超过一百万字。故事发生在北宋末年,以大理…...
深度学习 Pytorch 建模可视化工具TensorBoard的安装与使用
50 TensorBoard的安装和使用 在深度学习建模过程中,为了能够快速绘制模型基本结构、观察模型评估指标伴随训练过程的动态变化情况,当然也为了能够观察图像数据,我们可以使用TensorBoard工具来进行Pytorch深度学习模型的可视化展示。 Tensor…...
【免费】2007-2019年各省科技支出占一般公共预算支出的比重数据
2007-2019年各省科技支出占一般公共预算支出的比重数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、科技支出占一般公共预算支出的比重 4、范围:31省 5、指标解释:…...
19爬虫:使用playwright登录超级鹰
本次案例一共解决了如下两个问题: (1)如何使用playwright截图,特别是验证码图片 (2)在playwright中如何判断一个元素可见 1.截图 我们首先解决第一个问题,截图。如果前期接触过selenium的小伙…...
[转]Java面试近一个月的面试总结
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46753275 前言 打算换个工作,近一个月面试了不少的公司,下面将一些面试经验和思考分享给大家。另外校招也快要开始了,为…...
Spring Boot中使用MockMvc测试PATCH请求控制器
在Spring Boot项目中,对控制器进行单元测试是确保代码质量和功能正确性的重要环节。本文将通过一个具体的例子,展示如何使用Spring的MockMvc框架来测试处理PATCH请求的控制器。 示例项目结构 假设我们有一个简单的Spring Boot项目,其中包含一…...
html转PDF文件最完美的方案(wkhtmltopdf)
目录 需求 一、方案调研 二、wkhtmltopdf使用 如何使用 文档简要说明 三、后端服务 四、前端服务 往期回顾 需求 最近在做报表类的统计项目,其中有很多指标需要汇总,网页内容有大量的echart图表,做成一个网页去浏览,同时…...
ip地址是手机号地址还是手机地址
在数字化生活的浪潮中,IP地址、手机号和手机地址这三个概念如影随形,它们各自承载着网络世界的独特功能,却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语,经常被错误地与手机号地址或手机地址划上等号。本文旨在…...
【大数据技术】搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)
搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) jdk-8u361-linux-x64.tarhadoop-3.3.6.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Hadoop+MapReduce+Yarn的详细步骤。 注意: 统一约定将软件安装包存放…...
从零开始:OpenCV 图像处理快速入门教程
文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能 1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv::Point类 2.3 cv::Rng类 2.4 cv::Size类 2.5 cv:&…...
从PCB走线到连接器:手把手教你用ADS仿真优化S参数(避坑SI/PI设计)
从PCB走线到连接器:用ADS仿真优化S参数的实战指南 在高速数字电路和射频设计中,S参数就像设计师的"体检报告",直观反映信号传输路径的健康状况。想象一下,当你设计的PCIe Gen4接口在实验室测试时出现信号完整性问题&am…...
Windows 10/11打印服务总罢工?别急着重装,试试这几招修复Print Spooler自动停止
Windows 10/11打印服务罢工?5种专业修复方案拯救Print Spooler 办公室里最令人抓狂的时刻之一,就是当你急需打印文件时,发现打印机毫无反应。你检查服务管理器,发现那个关键的Print Spooler服务又自动停止了。这种情况在Windows …...
python 中的进制
进制是数值的表示方式,Python 原生支持二进制、八进制、十进制、十六进制,并提供了丰富的进制转换功能。一、进制表示方式1. 四种进制的字面量# 十进制(默认) dec 42 print(dec) # 42# 二进制:0b 或 0B 前缀 b…...
Windows热键侦探:快速定位热键冲突的终极解决方案
Windows热键侦探:快速定位热键冲突的终极解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾经遇…...
V型槽有灰还是镜头花了?三步排查图像模糊的真凶(工地实测版)
夏天的老旧小区弱电井,或者秋天刚刮过西北风的马路边,可以说是装维师傅们的"噩梦主场"。你蹲在逼仄的角落里,熟练地剥线、切割,把光纤小心翼翼地放入机器,按下防风盖。结果伴随着几声急促的"滴滴"…...
怎样高效搭建AI多智能体交易系统:3步快速部署完整方案
怎样高效搭建AI多智能体交易系统:3步快速部署完整方案 【免费下载链接】TradingAgents-AI.github.io TradingAgents: Multi-Agents LLM Financial Trading Framework 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-AI.github.io 想要让AI…...
3分钟搞定Windows和Office永久激活:KMS智能激活工具完整指南
3分钟搞定Windows和Office永久激活:KMS智能激活工具完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然…...
2025届最火的AI辅助论文方案横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 深寻作为先进的大型语言模型,在学术论文写作领域显现出明显的应用潜力ÿ…...
AUBO机械臂视觉跟踪避坑指南:手眼标定后,如何让末端稳定跟随移动的ArUco码?
AUBO机械臂视觉跟踪避坑指南:手眼标定后如何实现稳定动态跟随 在工业自动化领域,机械臂的视觉跟踪能力直接决定了柔性制造系统的智能化水平。AUBO i5作为国产协作机械臂的代表性产品,其与视觉系统的集成应用越来越广泛。然而,许多…...
Denoiser项目快速入门:5分钟完成语音降噪环境搭建
Denoiser项目快速入门:5分钟完成语音降噪环境搭建 【免费下载链接】denoiser Real Time Speech Enhancement in the Waveform Domain (Interspeech 2020)We provide a PyTorch implementation of the paper Real Time Speech Enhancement in the Waveform Domain. I…...
