解决VideoPlayer视频层级无法放在Cocos渲染底层问题—Android篇

解决VideoPlayer视频层级无法放在Cocos渲染底层问题—Android篇

由于一些业务场景下,我们需要播放视频,但又不希望视频总是处于cocos顶层播放,我们还可能希望在视频上层做一些Cocos层的事情,因目前官方的组件不支持原生版本的置底操作。经本人查阅资料,找到适合于Cocos3.6方法。

文章参考2.x版本方案 VideoPlayer层级(置底)解决方案

第一步

  • 开启cocos背景透明,由于我们希望在cocos下层依然显示一些东西,那么就需要把cocos背景设置为透明
  • Cocos项目设置->宏配置->开启 ENABLE_TRANSPARENT_CANVAS
  • 设置Camera组件的ClearColor颜色alpha通道为0

第二步

  • 修改CocosVideoHelper.java

    位于:Creator\3.x.x\resources\resources\3d\engine\native\cocos\platform\android\java\src\com\cocos\lib

    修改_createVideoView方法如下

    private void _createVideoView(int index) {
            CocosVideoView videoView = new CocosVideoView(mActivity,index);
            sVideoViews.put(index, videoView);
            FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT);
            //mLayout.addView(videoView, lParams);
            //videoView.setZOrderOnTop(true);
    
            mLayout.addView(videoView,0, lParams);
    
            videoView.setZOrderMediaOverlay(false);
            videoView.setZOrderOnTop(false);
    
            videoView.setVideoViewEventListener(videoEventListener);
        }
    
    
  • 修改CocosVideoView.java

    位于:Creator\3.x.x\resources\resources\3d\engine\native\cocos\platform\android\java\src\com\cocos\lib

    修改onTouchEvent方法如下

  • public boolean onTouchEvent(MotionEvent event) {
            if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
                this.sendEvent(EVENT_CLICKED);
            }
            return false;
            //return true;
        }
    
  • 在AppActivity中 onCreate方法中,增加如下代码

     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // DO OTHER INITIALIZATION BELOW
            SDKWrapper.shared().init(this);
    
            if (mSurfaceView != null) {
                mSurfaceView.setZOrderMediaOverlay(true); 
                mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
                mSurfaceView.setBackgroundColor(Color.TRANSPARENT);
            }
    }
    
    

第三步

  • 运行测试
4赞

刚好要用到,想问下能指定层级么?还是只能置底

image 这个好像只能最底层 ,要么上层, 和引擎的渲染是分开的

没法指定层级,在android的舞台节点树中,cocos也只是一个节点,和原生video组件,webview组件等都是一样的

这个方案就是调整video和canvas的层级,要么在上面要么在下面,没办法做夹心的效果。商城有做夹心效果的方案,思路就是将视频转sprite,实时转化,通过sprite去渲染视频的数据

那把视频放cocos节点下面,盖住视频的地方镂空吧

对 就是这个原理 , 一些应用场景够用

好的好的,明白 :wave: