一、背景:
Android 常用Surfaceview渲染对帧数要求高的图片动画或视频,平时用还好,一般都是铺满画面的,就算有现象也不明显。常见的现象也不过是图片加载闪烁,双锁再置0画布就好了。
这次项目要求动态根据原视频宽高,动态修改布局宽高,它进入退出时就会有明显闪烁的现象。
二、原因分析:
闪烁底图的现象原理就不多解释了,可以看其他大神的文章,主要就是Surfaceview会挖空当前布局,所以在未加载画面时,会显示底图。
闪烁原图的主要是因为难以人为提前获取视频文件的宽高size,只能在通过Mediaplayer的反馈监听来修改布局。
三、先说结论:
在首加载Surfaceview时,将LayoutParams置(1,1)。退出时,将LayoutParams重置(1,1)。
四、折腾过程:
我这边用的Mediaplayer是公司继承重写了的老古董代码,所以可能有些解决方法别人或许能有作用,我这儿确实没起效果。
网上常见有
1)Surfaceview上方挂遮挡view,mediaplayer 监听到onVideoSizeChanged 时修改布局宽高,在Surfaceview的surfaceChanged 监听到布局修改完成后,隐藏遮挡布局。
测试结果:无效,Mediaplayer 在获取后会先预加载首帧,之后prepared的监听器才获取视频文件宽高数据,此时背景已闪烁结束,遮挡的view这时才起作用。
2)调整Surfaceview属性,将它置于view树最上层
setZOrderOnTop(true);
mHolder.setFormat(PixelFormat.TRANSPARENT);
测试结果:对于底图闪烁问题有效果,但是其他播放按钮被遮挡无法正常显示;原图闪烁现象无法解决。
3)在首加载Surfaceview时,将LayoutParams置(1,1)
看到也有说LayoutParams置0或设置Invisible的,但是它一弄Mediaplayer直接不跑到下面几步了。
测试结构:一个方法解决两个问题,底图和原图都不闪烁了。
于是我在退出Surfaceview时,又执行了一遍重置LayoutParams(1,1),发现也不闪烁了。