一个VideoView的问题

在全屏的环境下,使用VideoView来轮播视频,在Android版本为5.1版本的板子上,显示正常。
而在Android 7.1版本的板子上,播放完视频后,虚拟按键跑了出来。每次播放完视频,底下一块灰色的出来。路人见了都觉得这玩意是不是坏了,用户见了都觉得不舒服,这么一点小问题,往严重点来说,都会被人质疑技术是不是不过关。这个问题必须得解决。
当这个现象出现时OnWindowFocusChange回调会被调用两次。一次为失去焦点,另一次为获取到焦点。在播放完一个视频,即将要播放下一个视频时出现。

感觉这与View的View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION相关,于是就在onWindowFocusChange那里主动设置。

View decorView = act.getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
        | View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView.setSystemUiVisibility(uiOptions);
act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

结果可以把虚拟按键的背景变为半透明,每次播完后,半透明的导航栏出现,过几秒消失,播放下一个再出现,过几秒又消失。这效果明显不符合需要。

在网上查了一下,说是VideoView有坑,还不少,不如自己用SurfaceView +MediaPlayer实现。试了一下,果然解决了问题。
但替换控件对原有代码影响较大,还可能出现未知bug。于是就看了一遍VideoView的源码,猜测哪里是引起问题的代码。
所幸VideoView的代码不算庞大,也就900多行,不少地方也可以注释掉,于是就仿照源码写了一个VideoView。写好后,将可疑的代码注释掉,再跑起来。期间甚至怀疑是requestLayout方法触发onWindowFocusChange继而产生bug,因为在setVideoUri方法中会调用requestLayout,invalidate。
凭借锲而不舍的精神最终找到了它。下图红色框处,注释掉后就没问题了。
在这里插入图片描述

而原来代码上设置了这个MediaController,将它注释掉,bug就改好了。在5.1的时候有这段是没有问题的。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值