Android 视频叠加显示功能 遇见8.0以下系统(小窗口视频不显示)

啊,我太难了。      膜拜的大佬曾经说过

每个做 UI 的 Android 开发 ,上辈子都是折翼的天使。

PS:近期迭代的版本要对直播回放 UI 做一次大调动。如上图所示(横屏竖屏)。。。横屏的时候右下角是小窗口视频 ,后面是大窗口视频 。

直接上为伪代码

/**
*fl_big_layout : 大窗口
*fl_little_layout : 小窗口
*/
 private void setFullScreen() {
        ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(CommonUtil.dp2px(mActivity, 120), CommonUtil.dp2px(mActivity, 90));
        ViewGroup.LayoutParams layoutParams = fl_big_layout.getLayoutParams();


        if (!mIsFullScreen) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

            mIsFullScreen = true;
            layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
            layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT;
            fl_big_layout.setLayoutParams(layoutParams);

            params.rightToRight = ConstraintLayout.LayoutParams.PARENT_ID;
            params.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
            fl_little_layout.setLayoutParams(params);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            mIsFullScreen = false;
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.height = getResources().getDimensionPixelSize(R.dimen.xdp_220);
            layoutParamsSpeed.width = ViewGroup.LayoutParams.MATCH_PARENT;
            fl_big_layout.setLayoutParams(layoutParams);

            params.rightToRight = ConstraintLayout.LayoutParams.PARENT_ID;
            params.topToBottom = R.id.fl_big_layout;
            fl_little_layout.setLayoutParams(params);

        }

    }

        1. 正常操作,横屏的时候把大窗口宽和高设置为填充,小窗口宽和高不变 ,运行一下我的测试机华为 P20 ,效果跟设想的一模一样没问题(哈哈,妥妥的没毛病)。

        2. 接下来是版本提测,在 OppoR11t 机型中出现了全屏之后小窗口不显示问题 。公司就一款 8.0 之下的系统,当时没太多的考虑就直接认定是 OPPO 手机兼容为题,说实话我一直对 OPPO 和 VIVO 手机有立场 。

        3. 之后又从朋友那测试了几款机型和系统 ,发现荣耀上也有这个问题系统是 6.0 ,当时我的心就凉了一大截 。

        4. 开始着手改这个"兼容性"问题,首先思考的是这个小窗口是被遮盖的还是隐藏了。因为我一直怀疑在 8.0 以下系统绘制约束布局可能有问题(之前遇到过)API 无效果 。用判断View是否覆盖的工具类证明 View 并没有覆盖 ,当然也是可见的。

        5. 之后问了一些朋友,得到了一个 bringToFront 这个 API ,作用是在 ViewGroup 树中将此 View 删除并添加到最后一个位置。也就是最后绘制这个View ,相当于是覆盖在之前的 VIew 中。-----无效果

        6. 需求临时要改动功能双击小窗口 ,大小窗口内容转换 。加完事件之后 ,神奇的一幕出现了 ,在全屏的时候不能看见这个小窗口 ,但是双击的时候可以响应事件 。 现在就更搞笑了 ,面临的问题是这个小窗口 View 可以响应事件 ,并且没有被覆盖 。但就是看不见视频 。

        7. 此时我又傻乎乎的写了一个demo ,测试一下看是不是我的代码问题 。demo中在 8.0 以下也是可以重叠的 ,说明我的代码逻辑是没问题的 ,我就怀疑到了SDK上 ,但是有看了友商的 APP 不存在这个问题 。

现在我的内心是平静的 。这个问题仿佛已经到了死胡同 ,根据目前所掌握的 Android 知识是无论如何也想不明白会出现此情况  (如果出现一个根本不符合常理的问题 ,那就一定是很小的问题)。在这里我想描述一个题外话 ,在我的职业生涯中遇到过很多很多无解的问题 ,每次陷入死角的时候我就会特别平静 ,因为我相信他是一个小问题 ,我相信这个问题进入到了我的知识盲区 ,一定会很简单 。

正常的 Google 和 BaiDu 。 发现了一些博客有对 SurfaceView 做介绍 ,在使用 SurfaceView 的时候两个视频重叠会不显示第二个小窗口 ,看完我就有点激动了 ,我还特意去看了一下 SDK 的 View 是不是 继承的 SurfaceView 哈哈 。

SurfaceView 遮挡 SurfaceView 背景问题 ,说的意思是 S 和 S 遮挡使用的时候 ,只有在 Activity 窗口最顶层才可以显示 ,要想姐解决这个问题需要调用 setZOrderOnTop ( setZOrderOnTop )

这个最顶层可见 ,但是不是透明的 ,所以我的进度条会被盖着 。

SurfaceView给的解决方案是调用 setZOrderMediaOverlay API

 完美解决。

发布了57 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37492806/article/details/102757115