转载自:https://worthatry.cn/cocos-creator-ru-he-shi-bei-jing-tou-ming/

最近使用Cocos Creator开发项目,有个需求是在视频上面添加按钮交互。由于视频调用的是系统原生控件,并且层级放置在了Cocos引擎层级之上,没有和游戏一起混合渲染,所以单纯在cocos这边改动 zIndex是没有效果的,必须要和对应平台打交道了。

为了实现视频上面放置UI,大概有三种思路:

  1. 将视频层级放到cocos层级之下,这样cocos的UI就可以显示在视频之上了。
  2. 需要放置到视频层级上的UI不使用cocos内置控件,调用对应平台控件放置在视频控件之上。
  3. 获取视频数据,渲染到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 控件相关推荐

  1. 8月2日Cocos 斗鱼直播:2小时现撸自定义UI控件

    嘟!嘟!嘟!Cocos斗鱼直播秀,将在下周二晚八点准时开车!本期我们要派出的当家主播,是位混迹江湖多年的老司机--子龙山人. 各位宝宝们先记得收好下面这张门票,下周二别忘记上车哦! 8月2日(周二)2 ...

  2. 【cocosStdio系列】之UI控件下

    [cocosStdio系列]之UI控件下       大家好,我是Lampard       今天与大家通过一个demo了解cocos给我们提供的各个UI控件 reference:<cocos2 ...

  3. 使用ExtJs创建新的UI控件(转)

    组合或扩展 当创建一个新类,往往要作出这么的一个选择:要么拥有某个工具类的实例来扮演首要的角色,要么扩展那个类. 使用ExtJs过程中,推荐从最靠近的基类开始扩展,实现所需的功能即可.这是因为Ext提 ...

  4. android 画布裁剪,一种基于Android系统对UI控件进行轮廓剪裁及美化的方法与流程...

    本发明涉及Android应用的技术领域,特别涉及一种基于Android系统对UI控件进行轮廓剪裁及美化的方法. 背景技术: 目前,随着智能电视的普及,Android应用层出不穷,而那些表现形式单一.传 ...

  5. JavaFX 的 UI 控件集 ControlsFX

    出处:http://www.oschina.net/p/controlsfx JavaFX 的 UI 控件集 ControlsFX ControlsFX 开源项目旨在为 JavaFX 开发提供更多的 ...

  6. JavaFX UI控件教程(二十八)之UI控件的自定义

    翻译自  Customization of UI Controls 本章介绍了UI控件自定义的各个方面,并总结了Oracle提供的一些提示和技巧,以帮助您修改UI控件的外观和行为. 您可以通过应用层叠 ...

  7. JavaFX UI控件教程(二十二)之Titled Pane和Accordion

    翻译自  Titled Pane and Accordion 本章介绍如何在JavaFX应用程序中使用accordion和title窗格的组合. 标题窗格是带标题的面板.它可以打开和关闭,它可以封装任 ...

  8. JavaFX UI控件教程(二十三)之Menu

    翻译自  Menu 本章介绍如何创建菜单和菜单栏,添加菜单项,将菜单分组,创建子菜单以及设置上下文菜单. 您可以使用以下JavaFX API类在JavaFX应用程序中构建菜单. 菜单栏 菜单项 菜单 ...

  9. JavaFX UI控件教程(十五)之Combo Box

    翻译自   Combo Box 本章介绍如何在JavaFX应用程序中使用组合框.它讨论了可编辑和不可编辑的组合框,教您如何跟踪可编辑组合框中的更改并处理它们上的事件,并解释如何使用单元工厂来更改组合框 ...

  10. JavaFX UI控件教程(十四)之Tree View

    翻译自   Tree View 在本章中,您将学习如何在JavaFX应用程序中构建树结构,向树视图添加项,处理事件以及通过实现和应用单元工厂来自定义树单元. 包的TreeView类javafx.sce ...

最新文章

  1. .net下绘制统计图工具-请推荐
  2. onethink封装arclist调用文章列表!
  3. Netbeans自定义mode
  4. linux服务器查询vdc等等,Linux云服务器
  5. 选择开源项目什么最重要?
  6. Redis数据的类型
  7. oracle 查看服务器密码修改,如何修改oracle用户密码
  8. Hadoop +x86平台:大数据分析的好拍档
  9. (转)Cesium教程系列汇总
  10. AXI 总线基本概念 - 如何理解outstanding传输
  11. vue element select 下拉加载更多
  12. 上海市犬伤处置门诊目录(上海哪些医院可以打狂犬疫苗)
  13. 公路多孔箱涵设计_箱涵结构设计.pdf
  14. shell中的Random随机数
  15. c语言调用鼠标驱动函数,鼠标驱动程序
  16. 智慧社区解决方案的服务形式有哪些
  17. 利用ASP显示当前在线人数
  18. 成都加米谷大数据教育:数据库设计中的 9 大常见错误
  19. 网站安全狗V4.0绕过姿势
  20. 段码LCD研究 | 用HT1621B驱动段码LCD屏

热门文章

  1. 电力IEC61850的基础知识和使用
  2. 多行文字cad提取数据_中望CAD如何快速批量提取txt文本数据
  3. CXF 中使用 wsdl2java 示例
  4. keil+c语言优化,KEIL编译器【C语言编译选项优化等级说明】
  5. 中交四航局及中广核工程公司学员参加友勤第12期Oracle P6项目管理软件培训班
  6. Java函数式编程详解
  7. Modelsim SE 的下载安装与注册
  8. ubuntu类似sourcetree的git可视化工具安装
  9. php tablesorter,插件 jQuery.tablesorter 中文API文档
  10. 图书馆网计算机编目管理系统,浅谈图书编目计算机管理系统