android常用系統bar高度
阿新 • • 發佈:2019-01-27
package com.zhangteng.myapplication; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Point; import android.graphics.Rect; import android.os.Build; import android.util.DisplayMetrics; import android.view.Display; import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; /** * Created by Lanxumit on 2017/9/25. */ public class SystemUtil { /** * 可以在NavigationBar的螢幕上準確的計算到螢幕的寬高 */ public static int getRealWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int screenWidth = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DisplayMetrics dm = new DisplayMetrics(); display.getRealMetrics(dm); screenWidth = dm.widthPixels; //或者也可以使用getRealSize方法 // Point size = new Point(); // display.getRealSize(size); // screenWidth = size.x; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display); } catch (Exception e) { DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); screenWidth = dm.widthPixels; } } return screenWidth; } public static int getRealHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int screenHeight = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DisplayMetrics dm = new DisplayMetrics(); display.getRealMetrics(dm); screenHeight = dm.heightPixels; //或者也可以使用getRealSize方法 // Point size = new Point(); // display.getRealSize(size); // screenHeight = size.y; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception e) { DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); screenHeight = dm.heightPixels; } } return screenHeight; } /** * 其高度可以通過讀取定義在Android系統尺寸資源中的status_bar_height獲得,所以不管當前Activity有沒有隱藏StatusBar,獲得的結果都是一樣的。 * @param context * @return */ public static int getStatusBarHeight(Context context) { int statusBarHeight = -1; Resources resources = context.getResources(); int resourceId = resources.getIdentifier("status_bar_height", "dimen","android"); if (resourceId > 0) { statusBarHeight = resources.getDimensionPixelSize(resourceId); } return statusBarHeight; } /** * 虛擬按鍵(NavigationBar)是部分Android手機螢幕底部用以取代物理按鍵的區域,可隱藏。其高度可以通過讀取定義在Android系統尺寸資源中的navigation_bar_height獲得,所以不管當前Activity有沒有隱藏NavigationBar,獲得的結果都是一樣的。 * @param context * @return */ public static int getNavigationBarHeight(Context context) { int navigationBarHeight = -1; Resources resources = context.getResources(); int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android"); if (resourceId > 0) { navigationBarHeight = resources.getDimensionPixelSize(resourceId); } return navigationBarHeight; } /** * 判斷NavigationBar是否顯示 * @param context * @return */ public static boolean isNavigationBarShow(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Display display = wm.getDefaultDisplay(); Point size = new Point(); Point realSize = new Point(); display.getSize(size); display.getRealSize(realSize); return realSize.y != size.y; } else { boolean menu = ViewConfiguration.get(context).hasPermanentMenuKey(); boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); if (menu || back) { return false; } else { return true; } } } /** * ActionBar就是在帶有ActionBar的Theme中StatusBar下方、Activity頂部的類似於標題欄的區域。其高度可以通過讀取定義在Android系統屬性資源中的actionBarSize獲得,所以不管當前Activity有沒有使用ActionBar,獲得的結果都是一樣的。 * @param context * @return */ public static float getActoinBarHeight(Context context) { TypedArray actionbarSizeTypedArray = context.obtainStyledAttributes(new int[] { android.R.attr.actionBarSize }); return actionbarSizeTypedArray.getDimension(0, 0); } /** * ContentView就是我們為Activity設計的layout佈局然後通過setContentView新增到Window上的那個View了。該方法推薦在onWindowFocusChanged()中執行,在onCreate()等方法中執行會返回0。 * @param activity * @return */ public static int getContentViewHeight(Activity activity) { Rect rectangle= new Rect(); activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle); return rectangle.height(); } /** * 程式能顯示(或者說可見)的區域。返回結果受StatusBar、NavigationBar和軟鍵盤等顯示/消失的狀態影響。當Activity隱藏了StatusBar、NavigationBar和軟鍵盤處於全屏狀態時,這個區域的大小就是螢幕的大小,即使Activity的Theme是Theme.Dialog之類。該方法推薦在onWindowFocusChanged()中執行,在onCreate()等方法中執行會返回0。 * @param activity * @return */ public static int getWindowVisibleDisplayHeight(Activity activity) { Rect rectangle= new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); return rectangle.height(); } }