Cocos Creator 如何在 VideoPlayer 上面放置 UI 控件
转载自:https://worthatry.cn/cocos-creator-ru-he-shi-bei-jing-tou-ming/
最近使用Cocos Creator开发项目,有个需求是在视频上面添加按钮交互。由于视频调用的是系统原生控件,并且层级放置在了Cocos引擎层级之上,没有和游戏一起混合渲染,所以单纯在cocos这边改动 zIndex
是没有效果的,必须要和对应平台打交道了。
为了实现视频上面放置UI,大概有三种思路:
- 将视频层级放到cocos层级之下,这样cocos的UI就可以显示在视频之上了。
- 需要放置到视频层级上的UI不使用cocos内置控件,调用对应平台控件放置在视频控件之上。
- 获取视频数据,渲染到cocos控件上。
第1、2种方式实现的最终效果一致。缺点是视频和cocos是分层显示的,所以视频只能放置在cocos控件的最下层。第三种方式可以自由调整视频层级,但我还没有实现细节的思路,不做探讨。本文基于 Cocos Creator 2.0.7
,其他版本引擎运行效果需自行测试。
我选择用第一种方式,简单粗暴。
首先要做的是把屏幕背景色设为透明,这一步骤在iOS、Android、Web上都需要做。打开Creator把场景挂载的 Camera
组件上的 backgroundColor
的R、G、B、A全部设为 0
,用于清除背景色。
然后在各个平台上调整视频层级到引擎层级下面。
iOS端:
在构建后的iOS原生工程下的 AppController.mm
文件里添加如下代码:
// 先添加videoView再添加cocosViewUIViewController* rvC = [[UIViewController alloc]init];// 视频viewUIView *videoView = [[UIView alloc] initWithFrame:bounds];videoView.tag = 10; // 通过tag找到view[rvC.view addSubview:videoView];// 引擎viewUIView *cocosView = _viewController.view;cocosView.frame = bounds;//cocosView.backgroundColor = [UIColor clearColor];[rvC.view addSubview:cocosView];// Set RootViewController to windowif ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){// warning: addSubView doesn't work on iOS6[window addSubview: rvC.view]; //新的rootView}else{// use this method on ios6[window setRootViewController:rvC]; //新的rootView}
具体如图:
接着修改VideoPlayer的默认层级。在引擎文件 VideoPlayer-ios.mm
中找到 [eaglview addSubview:self.moviePlayer.view];
方法,注释掉添加到默认层级的代码。通过tag找到我们之前新建的视频view,并添加视频到上面。加入如下代码:
[[[eaglview superview] viewWithTag:10] addSubview:self.moviePlayer.view]; // 添加到上层view
这里还要改一下颜色格式,要不然视频还是会被黑色背景遮住。在引擎文件 CCApplication-ios.mm
中找到 onCreateView
方法,我们看到引擎默认像素格式是 RGB565
。注释掉原来代码,把这里改为支持透明度的 RGBA8
格式。RGB565
这种格式是不支持透明度的,所以即使我们把 UIView设为透明,视频依然被黑色背景遮住。
Android端:
首先取消视频置顶。找到 Cocos2dxVideoHelper.java
文件,注释掉 setZOrderOnTop
方法。
紧接着,我们设置像素格式。在Android原生工程中,找到 AppActivity.java
文件,在 onCreateView
方法中添加设置 glSurfaceView
透明代码:
glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8);glSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);glSurfaceView.setZOrderMediaOverlay(true);
这时候视频已经可以显示在下方了,但是,如果视频上方有 cocos 按钮依然不可点击的,我们还需要向下传递事件。找到引擎目录下的 Cocos2dxVideoView.java
文件,重写 onTouchEvent
方法,返回false
。这样视频上方的cocos ui就可以响应触摸事件了。
Web端:
和Android、iOS一样,首先是调整视频层级到最下层。找到 js引擎
目录下的 video-player-impl.js
文件,在 _createDom
方法中添加修改视频层级代码:
// 调整视频层级到最下层video.style.zIndex = -1;
修改代码后还需要编译一下 js引擎
到engine目录下执行一下 gulp build
构建成功后,才能使修改的代码生效。
如果不想重新编译引擎,可以直接找到 js引擎
bin
文件夹下的 cocos2d-js-for-preview.js
文件搜索_createDom
方法中添加以上代码。
最后我们需要Canvas 背景是透明的,这样才能看到下层的视频。如果是开发时在网页上预览,需要修改Cocos Creator安装目录下, 找到preview-templates
文件夹下的 boot.js
文件,在 cc.game.run
之前加上如下代码:
// 开启支持全透明cc.macro.ENABLE_TRANSPARENT_CANVAS = true;
如果是打web包,则在 main.js
文件中的 cc.game.run
代码之前加入以上代码。
最终效果:
Cocos Creator 如何在 VideoPlayer 上面放置 UI 控件相关推荐
- 8月2日Cocos 斗鱼直播:2小时现撸自定义UI控件
嘟!嘟!嘟!Cocos斗鱼直播秀,将在下周二晚八点准时开车!本期我们要派出的当家主播,是位混迹江湖多年的老司机--子龙山人. 各位宝宝们先记得收好下面这张门票,下周二别忘记上车哦! 8月2日(周二)2 ...
- 【cocosStdio系列】之UI控件下
[cocosStdio系列]之UI控件下 大家好,我是Lampard 今天与大家通过一个demo了解cocos给我们提供的各个UI控件 reference:<cocos2 ...
- 使用ExtJs创建新的UI控件(转)
组合或扩展 当创建一个新类,往往要作出这么的一个选择:要么拥有某个工具类的实例来扮演首要的角色,要么扩展那个类. 使用ExtJs过程中,推荐从最靠近的基类开始扩展,实现所需的功能即可.这是因为Ext提 ...
- android 画布裁剪,一种基于Android系统对UI控件进行轮廓剪裁及美化的方法与流程...
本发明涉及Android应用的技术领域,特别涉及一种基于Android系统对UI控件进行轮廓剪裁及美化的方法. 背景技术: 目前,随着智能电视的普及,Android应用层出不穷,而那些表现形式单一.传 ...
- JavaFX 的 UI 控件集 ControlsFX
出处:http://www.oschina.net/p/controlsfx JavaFX 的 UI 控件集 ControlsFX ControlsFX 开源项目旨在为 JavaFX 开发提供更多的 ...
- JavaFX UI控件教程(二十八)之UI控件的自定义
翻译自 Customization of UI Controls 本章介绍了UI控件自定义的各个方面,并总结了Oracle提供的一些提示和技巧,以帮助您修改UI控件的外观和行为. 您可以通过应用层叠 ...
- JavaFX UI控件教程(二十二)之Titled Pane和Accordion
翻译自 Titled Pane and Accordion 本章介绍如何在JavaFX应用程序中使用accordion和title窗格的组合. 标题窗格是带标题的面板.它可以打开和关闭,它可以封装任 ...
- JavaFX UI控件教程(二十三)之Menu
翻译自 Menu 本章介绍如何创建菜单和菜单栏,添加菜单项,将菜单分组,创建子菜单以及设置上下文菜单. 您可以使用以下JavaFX API类在JavaFX应用程序中构建菜单. 菜单栏 菜单项 菜单 ...
- JavaFX UI控件教程(十五)之Combo Box
翻译自 Combo Box 本章介绍如何在JavaFX应用程序中使用组合框.它讨论了可编辑和不可编辑的组合框,教您如何跟踪可编辑组合框中的更改并处理它们上的事件,并解释如何使用单元工厂来更改组合框 ...
- JavaFX UI控件教程(十四)之Tree View
翻译自 Tree View 在本章中,您将学习如何在JavaFX应用程序中构建树结构,向树视图添加项,处理事件以及通过实现和应用单元工厂来自定义树单元. 包的TreeView类javafx.sce ...
最新文章
- .net下绘制统计图工具-请推荐
- onethink封装arclist调用文章列表!
- Netbeans自定义mode
- linux服务器查询vdc等等,Linux云服务器
- 选择开源项目什么最重要?
- Redis数据的类型
- oracle 查看服务器密码修改,如何修改oracle用户密码
- Hadoop +x86平台:大数据分析的好拍档
- (转)Cesium教程系列汇总
- AXI 总线基本概念 - 如何理解outstanding传输
- vue element select 下拉加载更多
- 上海市犬伤处置门诊目录(上海哪些医院可以打狂犬疫苗)
- 公路多孔箱涵设计_箱涵结构设计.pdf
- shell中的Random随机数
- c语言调用鼠标驱动函数,鼠标驱动程序
- 智慧社区解决方案的服务形式有哪些
- 利用ASP显示当前在线人数
- 成都加米谷大数据教育:数据库设计中的 9 大常见错误
- 网站安全狗V4.0绕过姿势
- 段码LCD研究 | 用HT1621B驱动段码LCD屏
热门文章
- 电力IEC61850的基础知识和使用
- 多行文字cad提取数据_中望CAD如何快速批量提取txt文本数据
- CXF 中使用 wsdl2java 示例
- keil+c语言优化,KEIL编译器【C语言编译选项优化等级说明】
- 中交四航局及中广核工程公司学员参加友勤第12期Oracle P6项目管理软件培训班
- Java函数式编程详解
- Modelsim SE 的下载安装与注册
- ubuntu类似sourcetree的git可视化工具安装
- php tablesorter,插件 jQuery.tablesorter 中文API文档
- 图书馆网计算机编目管理系统,浅谈图书编目计算机管理系统