在開發(fā)過程中,假如我們要從底部彈出一個(gè)popwindow,這時(shí)候我們需要考慮獲取實(shí)際顯示的虛擬鍵高度。
期望:
- 全面屏下
1.1 開啟全面屏開關(guān)-返回0
1.2 關(guān)閉全面屏開關(guān)-執(zhí)行非全面屏下處理方式 - 非全面屏下
2.1 沒有虛擬鍵-返回0
2.2 虛擬鍵隱藏-返回0
2.3 虛擬鍵存在且未隱藏-返回虛擬鍵實(shí)際高度
/**
* 獲取虛擬按鍵的高度
* 1. 全面屏下
* 1.1 開啟全面屏開關(guān)-返回0
* 1.2 關(guān)閉全面屏開關(guān)-執(zhí)行非全面屏下處理方式
* 2. 非全面屏下
* 2.1 沒有虛擬鍵-返回0
* 2.1 虛擬鍵隱藏-返回0
* 2.2 虛擬鍵存在且未隱藏-返回虛擬鍵實(shí)際高度
*/
public static int getNavigationBarHeightIfRoom(Context context) {
if(navigationGestureEnabled(context)){
return 0;
}
return getCurrentNavigationBarHeight(((Activity) context));
}
/**
* 全面屏(是否開啟全面屏開關(guān) 0 關(guān)閉 1 開啟)
*
* @param context
* @return
*/
public static boolean navigationGestureEnabled(Context context) {
int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);
return val != 0;
}
/**
* 獲取設(shè)備信息(目前支持幾大主流的全面屏手機(jī),親測(cè)華為、小米、oppo、魅族、vivo都可以)
*
* @return
*/
public static String getDeviceInfo() {
String brand = Build.BRAND;
if(TextUtils.isEmpty(brand)) return "navigationbar_is_min";
if (brand.equalsIgnoreCase("HUAWEI")) {
return "navigationbar_is_min";
} else if (brand.equalsIgnoreCase("XIAOMI")) {
return "force_fsg_nav_bar";
} else if (brand.equalsIgnoreCase("VIVO")) {
return "navigation_gesture_on";
} else if (brand.equalsIgnoreCase("OPPO")) {
return "navigation_gesture_on";
} else {
return "navigationbar_is_min";
}
}
/**
* 非全面屏下 虛擬鍵實(shí)際高度(隱藏后高度為0)
* @param activity
* @return
*/
public static int getCurrentNavigationBarHeight(Activity activity){
if(isNavigationBarShown(activity)){
return getNavigationBarHeight(activity);
} else{
return 0;
}
}
/**
* 非全面屏下 虛擬按鍵是否打開
* @param activity
* @return
*/
public static boolean isNavigationBarShown(Activity activity){
//虛擬鍵的view,為空或者不可見時(shí)是隱藏狀態(tài)
View view = activity.findViewById(android.R.id.navigationBarBackground);
if(view == null){
return false;
}
int visible = view.getVisibility();
if(visible == View.GONE || visible == View.INVISIBLE){
return false ;
}else{
return true;
}
}
/**
* 非全面屏下 虛擬鍵高度(無論是否隱藏)
* @param context
* @return
*/
public static int getNavigationBarHeight(Context context){
int result = 0;
int resourceId = context.getResources().getIdentifier("navigation_bar_height","dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}```