js快速排序 Opencv leetcodeLCP regex csv events import concurrency mtu原理 proxy orm jaxb Fries vue图表 后台管理模板下载 后台管理系统模板 虚拟机重启命令 一兆等于多少字节 svn更新本地代码 plsql连接mysql python如何注释 python中import python的编译器 java正则 java案例 java接口文档 java数组输出 java遍历list集合 java入门基础 java函数调用 java程序设计教程 linux简介 shell脚本参数 python源码下载 tmac修改器 sp5 m4a转mp3格式转换器 路由器有辐射吗 props 手机照片恢复免费软件
当前位置: 首页 > 学习教程  > 编程语言

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

2020/7/24 10:38:30 文章标签:

一、背景:

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

 

 


本文链接: http://www.dtmao.cc/news_show_50321.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?