Android全面屏適配與判斷超詳細講解
1.全面屏的適配
全面屏出現(xiàn)后,如果不做適配,屏幕上會出現(xiàn)上下黑邊,影響視覺效果。
針對此問題,Android官方提供了適配方案,即提高App所支持的最大屏幕縱橫比,實現(xiàn)起來也比較簡單,在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是靜態(tài)方法,所以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;
}
通過檢驗發(fā)現(xiàn),此方法并不能判斷是否為全面屏,因為全面屏的手機通過以上方法,判斷的值為:true。
因此,需要從其他方面進行判斷,全面屏與傳統(tǒng)屏的區(qū)別在于,屏幕的縱橫比,所以,可以從縱橫比方面做出判斷,詳細代碼如下:
/**
* 判斷是否是全面屏
*/
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;
}
直接用這個方法,會發(fā)現(xiàn)不起作用,需要在 onCreate(Bundle savedInstanceState)方法中加入一下代碼:
//設置底部導航欄顏色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.white));
}
這個既可以作為修改導航欄顏色,也是必須的,否則判斷是否啟用虛擬導航的方法的無效。
到此這篇關于Android全面屏適配與判斷超詳細講解的文章就介紹到這了,更多相關Android全面屏適配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
listView的item中有checkbox,導致setOnItemClick失效的原因及解決辦法
這篇文章主要介紹了listView的item中有checkbox,導致setOnItemClick失效的原因及解決辦法,需要的朋友可以參考下2017-01-01
Android編程使WebView支持HTML5 Video全屏播放的解決方法
這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細的分析了全屏播放所涉及的相關技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下2015-10-10
Mac中配置gradle環(huán)境及使用android studio打包jar包與arr包的方法
這篇文章主要給大家介紹了關于在Mac中配置gradle環(huán)境,以及使用android studio打包jar包與arr包的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01
Android沉浸式狀態(tài)欄微技巧(帶你真正理解沉浸式模式)
因為Android官方從來沒有給出過沉浸式狀態(tài)欄這樣的命名,只有沉浸式模式(Immersive Mode)這種說法.下面通過本文給大家介紹Android沉浸式狀態(tài)欄微技巧,需要的朋友參考下2016-12-12
基于flutter?sound插件實現(xiàn)錄音與播放功能
這篇文章主要介紹了基于flutter?sound插件實現(xiàn)錄音與播放功能,介紹了如何錄音,如何播放本地和遠程音頻文件,以及如何實現(xiàn)動畫,在錄制完音頻文件后如何上傳,這些都是我們平常使用這個功能會遇到的問題。在使用的過程中遇到的問題也有列出,需要的朋友可以參考下2022-05-05
Android Studio配置國內(nèi)鏡像源(利用hosts)
這篇文章主要介紹了Android Studio配置國內(nèi)鏡像源(利用hosts),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

