android常用系统bar高度
2017-09-25 15:01
211 查看
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(); } }
相关文章推荐
- Android系统五种常用的 Menu!OptionMenu/ContextMenu/Actionbar/Contextual aciton mode/popup menu
- Android: 常用系统广播
- Android系统的常用权限
- android actionBar修改高度内容居中
- Android系统中常用的Uri
- android系统的常用权限
- android系统常用URI
- 【Android】调用系统应用常用uri & intent设置
- Android常用代码之普通及系统权限静默安装APK
- Android 获取常用的系统及应用的版本信息
- Android获取常用辅助方法(获取屏幕高度、宽度、密度、通知栏高度、截图)
- 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)
- Android系统自带的部分常用样式(android:theme)
- Android------Android系统的常用权限
- Android - Broadcast 常用的系统广播总结
- android系统常用URI
- Android编译环境,Build系统的学习总结c常用
- Android常用系统广播
- android 常用系统信息获取总结
- Android 常用系统服务 学习总结