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

一、背景:

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值