Android全面屏适配与判断超详细讲解
作者:itbird01 时间:2022-02-02 20:49:34
1.全面屏的适配
全面屏出现后,如果不做适配,屏幕上会出现上下黑边,影响视觉效果。
针对此问题,Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比,实现起来也比较简单,在AndroidManifest.xml中做如下配置即可,在AndroidManifet里的下声明:
<meta-data android:name="android.max_aspect"
android:value="ratio_float"/>
将ratio_float设置为2.1即可适配一众全面屏手机,即:
<meta-data
android:name="android.max_aspect"
android:value="2.1" />
2.判断是否为全面屏
很多的手机是有虚拟导航栏的,特别是华为手机,有人提议通过判断是否含有虚拟导航栏,不就可以判断是否为全面屏了吗?
/**
* 判断设备是否存在NavigationBar(虚拟导航栏)
*
* @return true 存在, false 不存在
*/
public static boolean deviceHasNavigationBar() {
boolean haveNav = false;
try {
//1.通过WindowManagerGlobal获取windowManagerService
// 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
Class<?> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal");
Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService");
getWmServiceMethod.setAccessible(true);
//getWindowManagerService是静态方法,所以invoke null
Object iWindowManager = getWmServiceMethod.invoke(null);
//2.获取windowMangerService的hasNavigationBar方法返回值
// 反射方法:haveNav = windowManagerService.hasNavigationBar();
Class<?> iWindowManagerClass = iWindowManager.getClass();
Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar");
hasNavBarMethod.setAccessible(true);
haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager);
} catch (Exception e) {
e.printStackTrace();
}
return haveNav;
}
通过检验发现,此方法并不能判断是否为全面屏,因为全面屏的手机通过以上方法,判断的值为:true。
因此,需要从其他方面进行判断,全面屏与传统屏的区别在于,屏幕的纵横比,所以,可以从纵横比方面做出判断,详细代码如下:
/**
* 判断是否是全面屏
*/
private volatile static boolean mHasCheckAllScreen;
private volatile static boolean mIsAllScreenDevice;
public static boolean isAllScreenDevice(Context context) {
if (mHasCheckAllScreen) {
return mIsAllScreenDevice;
}
mHasCheckAllScreen = true;
mIsAllScreenDevice = false;
// 低于 API 21的,都不会是全面屏。。。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return false;
}
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (windowManager != null) {
Display display = windowManager.getDefaultDisplay();
Point point = new Point();
display.getRealSize(point);
float width, height;
if (point.x < point.y) {
width = point.x;
height = point.y;
} else {
width = point.y;
height = point.x;
}
if (height / width >= 1.97f) {
mIsAllScreenDevice = true;
}
}
return mIsAllScreenDevice;
}
例如:此判断在PopupWindow兼容适配有虚拟导航栏手机和全面屏的显示时,底部被虚拟导航栏遮盖,或者全面屏手机下方有间隙。
3.全面屏手机的虚拟导航和全面屏手势的判断
全面屏手机手势是一特色,但也还是有习惯了用虚拟导航栏的,因此在判断是否为全面屏手机的基础上,需要做虚拟导航栏的适配;
判断是否启用虚拟导航的方法:
/**
* 判断全面屏是否启用虚拟键盘
*/
private static final String NAVIGATION = "navigationBarBackground";
public static boolean isNavigationBarExist(@NonNull Activity activity) {
ViewGroup vp = (ViewGroup) activity.getWindow().getDecorView();
if (vp != null) {
for (int i = 0; i < vp.getChildCount(); i++) {
vp.getChildAt(i).getContext().getPackageName();
if (vp.getChildAt(i).getId()!=-1&& NAVIGATION.equals(activity.getResources().getResourceEntryName(vp.getChildAt(i).getId()))) {
return true;
}
}
}
return false;
}
直接用这个方法,会发现不起作用,需要在 onCreate(Bundle savedInstanceState)方法中加入一下代码:
//设置底部导航栏颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.white));
}
这个既可以作为修改导航栏颜色,也是必须的,否则判断是否启用虚拟导航的方法的无效。
来源:https://blog.csdn.net/baobei0921/article/details/128445527
标签:Android,全面屏,适配,判断
0
投稿
猜你喜欢
C#中应用程序集的装载过程详解
2023-03-30 19:06:05
Spring Boot中lombok的安装与使用详解
2021-08-26 14:50:38
Android内置SQLite的使用详细介绍
2021-10-24 11:44:17
手动添加jar包进Maven本地库内的方法
2023-08-03 03:10:09
SpringBoot分页查询功能的实现方法
2023-07-14 02:22:21
C#中的Explicit和Implicit详情
2022-09-06 06:50:54
Java毕业设计实战之医院心理咨询问诊系统的实现
2022-07-04 19:02:21
Java语言中cas指令的无锁编程实现实例
2022-10-13 19:20:28
Android 应用指定浏览器开发实例
2022-02-10 03:34:09
Java基于websocket协议与netty实时视频弹幕交互实现
2023-08-16 11:55:46
java利用Future实现多线程执行与结果聚合实例代码
2023-09-24 11:07:18
MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决
2021-07-05 23:25:00
c# Thread类的用法详解
2023-02-08 06:53:28
Android实现聊天界面
2023-04-09 22:57:57
SpringMVC @RequestMapping注解详解
2022-08-08 06:58:14
微信支付仅能成功调用一次问题的解决方法(Android)
2021-07-27 10:40:17
Android实现App中导航Tab栏悬浮的功能
2021-11-22 23:11:31
Flutter实现自定义筛选框的示例代码
2022-08-13 21:52:40
Java经典面试题最全汇总208道(五)
2023-11-10 07:06:46
java连接SQL Server数据库的方法
2022-10-14 04:16:56