啊,我太难了。 膜拜的大佬曾经说过
每个做 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
完美解决。