前言
在开发视频浮窗时,遇到一个非常棘手的bug,困扰了好久,等到其余功能都完善后,最后集中力量把它解决了。因为困扰时间太长了,所以觉得记录一下这一次的问题以及排查流程。
问题
首次打开视频浮窗时,画面不能占满浮窗全屏,关闭后再次打开就不会出现该bug。
排查过程
- 有两个播放器使用了浮窗功能,其中只有一个播放器出现该问题,因此确定是是视频播放器的bug。
- 视频播放器也不是所有模式都出现bug,只有竖屏视频的模式才出现,而竖屏视频的属性都是在视频播放器的
onMeasure中作用生效的。因此确定是onMeasure的bug。 - 尝试重写浮窗view的
onMeasure不能修复bug,由于播放器是由页面直接传递给浮窗的,因此缩小范围至播放器的textureView中的onMeasure方法 - 在
textureView中打日志和断点排查后,基本确定了bug产生的原因。
原因
textureView的onMeasure代码如下
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int viewRotation = (int) getRotation();
//处理前的视频宽高
int videoWidth = currentVideoWidth;
int videoHeight = currentVideoHeight;
//父控件的宽高
int parentHeight = ((View) getParent()).getMeasuredHeight();
int parentWidth = ((View) getParent()).getMeasuredWidth();
if (parentWidth != 0 && parentHeight != 0 && videoWidth != 0 && videoHeight != 0) {
if (resizeType == JzConfig.VIDEO_IMAGE_DISPLAY_TYPE_FILL_PARENT) {
if (viewRotation == 90 || viewRotation == 270) {
int tempSize = parentWidth;
parentWidth = parentHeight;
parentHeight = tempSize;
}
//使用父控件的画面比例,计算视频画面的比例
/*强制充满**/
videoHeight = videoWidth * parentHeight / parentWidth;
}
}
...
}
日志如下:
由于首次开启浮窗时,播放器已生成,而播放器的textureView的onMeasure根据之前的父控件已经确定了视频画面比例,所以打开浮窗后还是显示着原来的画面比例,导致不能占满浮窗大小播放。
解决
由于首次浮窗生成是在视频textureView的onMeasure之后,因此只需要在浮窗生成之后,再调用textureView的onMeasure,重新测量浮窗作为父控件的画面比例,就可以解决问题。
总结
这次bug排查过程很耗时,也让我总结出了一些经验:
- 找出bug与正常之间的不同点
- 细心耐心地查看源码和了解基础方法