为 Cocos2d-x 接入原生相机预览时,需要让游戏画布的透明区域显示下层原生视图。仅把清屏色 alpha 改为 0 还不够,原生窗口和渲染 Surface 也必须支持透明。
Android 端
1. 配置透明 Activity 主题
在 AndroidManifest.xml 中,将 AppActivity 的主题设置为支持透明:
1 | android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" |
2. 将清屏色 alpha 设为 0
可以在 C++ 初始化时设置,也可以在需要透明的 Lua 场景中设置:
1 | // C++ |
1 | -- Lua 在需要透明的地方调用: |
3. 检查原生渲染视图
不同 Cocos2d-x 版本的 Android 模板还可能需要为 GLSurfaceView 配置透明像素格式、Z 顺序及透明背景。具体接口取决于项目模板,不能只凭上述两项保证所有版本生效。
如果屏幕上方出现白条,应先检查 Cocos2dxEditText 的尺寸、背景和布局参数。只有项目完全不使用 EditBox 时,才考虑移除下面这些创建代码;直接删除会导致输入框功能不可用:
1 | //Cocos2dxActivity.java 注释掉下面几行 |
iOS 端
清屏色同样需要使用 alpha 0:
1 | // C++ |
1 | -- Lua 在需要透明的地方调用: |
1 | // Objective-C++(.mm) |
iOS 还需要让承载 Cocos2d-x 的原生视图及其上层容器不绘制不透明背景,否则透明清屏色仍会显示为容器底色。
验证要点
- 清屏后透明区域能看到下层原生视图,而不是黑色或白色。
EditBox、触摸事件和前后台切换仍然正常。- 真机相机预览没有被渲染 Surface 的 Z 顺序遮挡。
- 不需要透明的页面恢复预期背景,避免意外透出 Activity 或 ViewController 底层内容。