網站首頁 編程語言 正文
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
相關推薦
- 2022-07-31 Python常見的幾種數據加密方式_python
- 2022-06-22 python?實現?mp3Play?音頻播放_python
- 2024-01-14 在springboot中給mybatis加攔截器
- 2022-04-28 python的字典和集合你了解嗎_python
- 2022-09-01 Linux實現項目的自動化部署_Linux
- 2022-06-10 阿里云日志服務日志過濾器配置_服務器其它
- 2022-09-24 Go?select使用與底層原理講解_Golang
- 2023-03-15 C語言枚舉與聯合圖文梳理講解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支