当前位置: 代码迷 >> 综合 >> 备忘——Surfaceview中Mediaplayer播放器自适应宽高,打开退出时底图、原图闪烁问题
  详细解决方案

备忘——Surfaceview中Mediaplayer播放器自适应宽高,打开退出时底图、原图闪烁问题

热度:54   发布时间:2024-01-31 15:00:45.0

一、背景:

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),发现也不闪烁了。