android 首次打开视频浮窗,画面不能占满全屏的bug

284 阅读2分钟

前言

在开发视频浮窗时,遇到一个非常棘手的bug,困扰了好久,等到其余功能都完善后,最后集中力量把它解决了。因为困扰时间太长了,所以觉得记录一下这一次的问题以及排查流程。

问题

首次打开视频浮窗时,画面不能占满浮窗全屏,关闭后再次打开就不会出现该bug。

排查过程

  1. 有两个播放器使用了浮窗功能,其中只有一个播放器出现该问题,因此确定是是视频播放器的bug。
  2. 视频播放器也不是所有模式都出现bug,只有竖屏视频的模式才出现,而竖屏视频的属性都是在视频播放器的onMeasure中作用生效的。因此确定是onMeasure的bug。
  3. 尝试重写浮窗view的onMeasure不能修复bug,由于播放器是由页面直接传递给浮窗的,因此缩小范围至播放器的textureView中的onMeasure方法
  4. textureView中打日志和断点排查后,基本确定了bug产生的原因。

原因

textureViewonMeasure代码如下

@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;
    }
  }
  ...
  }

日志如下: 浮窗画面不占满bug.png

由于首次开启浮窗时,播放器已生成,而播放器的textureViewonMeasure根据之前的父控件已经确定了视频画面比例,所以打开浮窗后还是显示着原来的画面比例,导致不能占满浮窗大小播放。

解决

由于首次浮窗生成是在视频textureViewonMeasure之后,因此只需要在浮窗生成之后,再调用textureViewonMeasure,重新测量浮窗作为父控件的画面比例,就可以解决问题。

总结

这次bug排查过程很耗时,也让我总结出了一些经验:

  1. 找出bug与正常之间的不同点
  2. 细心耐心地查看源码和了解基础方法