做事就像一张大网,只有你走的够远,走的路够多,才能知道下个正确的节点在哪
昨天公司测试大佬提出个问题,公司项目在oppo的刘海屏上,播放的控制器被刘海盖住了。如图:
看到这个首先想到的是再把距离调下点,但是这不是根除问题的方法,所以弃用该方法。
直接介绍我的解决办法:
项目用的是ijkPlayer,播放器有个控制器,在控制器布局中添加一个topView,如下:
android:id="@+id/view_video_top"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:background="@color/alpha_complete_black_7"/>
VideoView中添加逻辑代码:
* 刘海屏处理
*/
public void UpdateLiuHaiScreen(){
if (viewTop == null) {
viewTop = contentView.findViewById(R.id.view_video_top);
}
if (getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 全屏幕
if (ZYIsLiuHaiScreenUtils.hasNotchScreen(activity)){
ViewGroup.LayoutParams params = viewTop.getLayoutParams();
params.height = 0;
viewTop.setLayoutParams(params);
viewTop.setVisibility(VISIBLE);
}
} else {
if (ZYIsLiuHaiScreenUtils.hasNotchScreen(activity) && Build.VERSION.SDK_INT < Build.VERSION_CODES.P){
new ZYTranslucentStatus(activity).setSliderLayoutParams(VideoPlayView.this, ZYIsLiuHaiScreenUtils.hasNotchScreen(activity));
ViewGroup.LayoutParams params = viewTop.getLayoutParams();
params.height = ZYCommonUtils.getStatusBarHeight(context);
viewTop.setLayoutParams(params);
viewTop.setVisibility(VISIBLE);
} else {
new ZYTranslucentStatus(activity).setSliderLayoutParams(VideoPlayView.this);
}
}
}
然后再初始化和切换竖屏模式时调用改方法,及可。
setSliderLayoutParams
方法主要是处理VideoView的竖屏下高度问题,此处有一个小bug,适配刘海屏后,TopView高度设置后,VideoView的高度并没有增高,解决方法如下:
public void setSliderLayoutParams(ViewGroup viewGroup, boolean isLiuHai) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.width = getScreenPixels();
if (isLiuHai){
layoutParams.height = (getScreenPixels() * 9 / 16)+getStatusBarHeight();
} else {
layoutParams.height = (getScreenPixels() * 9 / 16);
}
viewGroup.setLayoutParams(layoutParams);
}
如果是刘海屏的话,就在高度上添加上statusbar的高度。这里又出现一个问题 / 在小米8上测试发现statusbar的高度特别高,貌似是小米自己把刘海的高度处理了,所以出现这种问题。小米8的系统是基于API28的,我的处理方法是,再判断API版本,低于28才会去加上statusbar的高度,否则videoView的高度还是原来的算法。