Android中状态栏的高度
Android中状态栏的高度是多less? 它总是一样的吗?
从我的测量看来,它似乎是25dp,但我不确定它是否在所有平台上具有相同的高度。
(我想知道这个从一个没有状态栏的活动中正确地实现一个淡入淡出的过渡)
这个问题已经回答了… 状态栏的高度?
更新 ::
目前的方法:
好吧,状态栏的高度取决于屏幕尺寸,例如,在屏幕尺寸为240 X 320,设备状态栏高度为20像素的设备中,对于屏幕尺寸为320 X 480的设备,状态栏高度为25像素,对于设备与480×800的状态栏高度必须是38px
所以我build议使用这个脚本来获得状态栏的高度
Rect rectangle = new Rect(); Window window = getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectangle); int statusBarHeight = rectangle.top; int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight= contentViewTop - statusBarHeight; Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight);
(旧的方法)来获取你的Activity的onCreate()
方法的状态栏的高度,使用这个方法:
public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }
在我用来获取状态栏高度的所有代码示例中,实际看起来只能在Activity
的onCreate
方法中工作的是:
public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }
显然状态栏的实际高度保持为Android资源。 上面的代码可以被添加到一个ContextWrapper
类(例如一个Activity
)。
发现在http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
在MDPI设备上,状态栏是25px。 我们可以使用这个作为基础,并乘以密度(四舍五入)来获得任何设备上的状态栏高度:
int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);
供参考:ldpi = .75,mdpi = 1,hdpi = 1.5,xhdpi = 2
根据Google的devise指引 , 状态栏的高度是24 dp。
如果你想得到状态栏的高度像素,你可以使用下面的方法:
private static int statusBarHeight(android.content.res.Resources res) { return (int) (24 * res.getDisplayMetrics().density); }
这可以从以下活动中调用:
statusBarHeight(getResources());
我已经合并了一些解决scheme:
public static int getStatusBarHeight(final Context context) { final Resources resources = context.getResources(); final int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) return resources.getDimensionPixelSize(resourceId); else return (int) Math.ceil((VERSION.SDK_INT >= VERSION_CODES.M ? 24 : 25) * resources.getDisplayMetrics().density); }
另一种select:
final View view = findViewById(android.R.id.content); runJustBeforeBeingDrawn(view, new Runnable() { @Override public void run() { int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight(); } });
这也适用于参考链接
public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }
我有一个onCreate状态栏高度相同的问题。 这对我有用。
private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19; private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25; private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;
在onCreate里面:
DisplayMetrics displayMetrics = new DisplayMetrics(); ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics); int statusBarHeight; switch (displayMetrics.densityDpi) { case DisplayMetrics.DENSITY_HIGH: statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT; break; case DisplayMetrics.DENSITY_MEDIUM: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; break; case DisplayMetrics.DENSITY_LOW: statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT; break; default: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; }
看到:
http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
是的,当我尝试它与查看它提供了25px的结果。 这是整个代码:
public class SpinActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout lySpin = new LinearLayout(this); lySpin.setOrientation(LinearLayout.VERTICAL); lySpin.post(new Runnable() { public void run() { Rect rect = new Rect(); Window window = getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight = contentViewTop - statusBarHeight; System.out.println("TitleBarHeight: " + titleBarHeight + ", StatusBarHeight: " + statusBarHeight); } } } }
官方身高是24dp
,正如Google在Androiddevise网页上所说的那样。
默认的高度是25dp。 随着Android棉花糖(API 23)的高度减less到24dp。
240×320 – 20px
320×480 – 25px
480×800 + – 38px
尝试这个:
Rect rect = new Rect(); Window win = this.getWindow(); win.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight = contentViewTop - statusBarHeight; Log.d("ID-ANDROID-CONTENT", "titleBarHeight = " + titleBarHeight );
它在onCreate方法中并不适用于我,但是当我把它放在onClickListener中,并给了我一个25
在android 6.0中状态栏的高度是24dp
<!-- Height of the status bar --> <dimen name="status_bar_height">24dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_height">48dp</dimen>
你可以在源代码中find答案:frameworks \ base \ core \ res \ res \ values \ dimens.xml
为了解决这个问题,我使用了一种组合方法。 这是必要的,因为在tablet上,当调用display.getHeight()时,系统栏已经减去它的像素。 所以我首先检查系统栏是否存在,然后是Ben Claytons的方法,在手机上工作正常。
public int getStatusBarHeight() { int statusBarHeight = 0; if (!hasOnScreenSystemBar()) { int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } } return statusBarHeight; } private boolean hasOnScreenSystemBar() { Display display = getWindowManager().getDefaultDisplay(); int rawDisplayHeight = 0; try { Method getRawHeight = Display.class.getMethod("getRawHeight"); rawDisplayHeight = (Integer) getRawHeight.invoke(display); } catch (Exception ex) { } int UIRequestedHeight = display.getHeight(); return rawDisplayHeight - UIRequestedHeight > 0; }
切换全屏解决scheme:
此解决scheme可能看起来像一个解决方法,但它实际上是否是您的应用程序是全屏(也就是隐藏状态栏)的帐户:
Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int barheight = size.y - findViewById(R.id.rootView).getHeight();
这样,如果你的应用程序目前是全屏, barheight
将等于0。
就我个人而言,我不得不用这个来纠正绝对的TouchEvent坐标来说明状态栏,如下所示:
@Override public boolean onTouch(View view,MotionEvent event) { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int YCoord = (int)event.getRawY() - size.y + rootView.getHeight()); }
这将得到绝对的y坐标是否应用程序是全屏或不。
请享用
如果你确切知道尺寸VS高度
喜欢
例如在具有320×480屏幕尺寸的设备中,状态栏高度是25px,对于具有480×800的设备,状态栏高度必须是38px
那么你可以得到你的视图的宽度/屏幕大小,你可以使用if else语句来获得状态栏的高度
在Android 4.1及更高版本中,您可以将应用程序的内容设置为显示在状态栏的后面,以便状态栏隐藏和显示时不会调整内容的大小。 为此,请使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。 您可能还需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE来帮助您的应用保持稳定的布局。
当您使用这种方法时,确保应用程序UI的关键部分(例如,地图应用程序中的内置控件)最终不会被系统栏覆盖,这是您的责任。 这可能会使您的应用程序无法使用。 在大多数情况下,您可以通过将android:fitsSystemWindows属性添加到您的XML布局文件来处理此问题,将其设置为true。 这将调整父ViewGroup的填充以为系统窗口留出空间。 这对于大多数应用来说已经足够
但是,在某些情况下,您可能需要修改默认的填充以获得您应用的所需布局。 要直接操纵你的内容相对于系统栏(占据一个称为窗口的“内容插入”的空间)的方式,重写fitSystemWindows(Rect插入)。 当窗口的内容插入已经改变时,视图层次结构调用fitSystemWindows()方法,以允许窗口相应地调整其内容。 通过覆盖这个方法,你可以处理插入(因此你的应用程序的布局),无论你想要的。
forms: https : //developer.android.com/training/system-ui/status.html#behind
顶级答案对某些人不起作用的原因是因为在准备渲染之前无法获得视图的维度。 实际上可以使用OnGlobalLayoutListener
获取上述维度:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ViewGroup decorView = (ViewGroup) this.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= 16) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { // Nice one, Google decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); rect.top; // This is the height of the status bar } } }
这是最可靠的方法。
硬编码或使用reflection来获取status_bar_height
的值被认为是不好的做法。 克里斯· 巴恩斯( Chris Banes) 在纽约Droidcon上谈到了这件事 。 获取状态栏大小的推荐方法是通过OnApplyWindowInsetsListener :
myView.setOnApplyWindowInsetsListener { view, insets -> { val statusBarSize = insets.systemWindowInsetTop return insets }
这是在API 20中添加的,也是通过ViewAppCompat进行回溯 。