hpi*_*que 314 android statusbar
Android中状态栏的高度是多少?总是一样的吗?
根据我的测量结果,它似乎是25dp,但我不确定它是否在所有平台上具有相同的高度.
(我想知道这是为了正确实现从没有状态栏的活动到执行状态栏的活动的淡入淡出过渡)
Jor*_*sys 353
这个问题之前得到了解答...... 状态栏的高度?
更新 ::
好的,状态栏的高度取决于屏幕尺寸,例如在屏幕尺寸为240 X 320的设备中,状态栏高度为20px,对于屏幕尺寸为320 X 480的设备,状态栏高度为25px,对于状态栏高度为480 x 800的设备必须为38px
所以我建议使用此脚本来获取状态栏高度
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);
Run Code Online (Sandbox Code Playgroud)
onCreate()Activity 的方法上状态栏的高度,使用此方法:public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*ton 204
在我用来获取状态栏高度的所有代码示例中,实际看起来在onCreatean方法中工作的唯一一个Activity是:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
显然,状态栏的实际高度保留为Android资源.上面的代码可以添加到ContextWrapper类(例如Activity)中.
发现于http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/
Gra*_*hew 48
在MDPI设备上,状态栏为25px.我们可以使用它作为基础并将其乘以密度(向上舍入)以获得任何设备上的状态栏高度:
int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);
Run Code Online (Sandbox Code Playgroud)
供参考:ldpi = .75,mdpi = 1,hdpi = 1.5,xhdpi = 2
Nik*_*las 41
硬编码大小或使用反射来获得值status_bar_height被认为是不好的做法.Chris Banes 在Droidcon纽约谈到了这一点.获取状态栏大小的推荐方法是通过OnApplyWindowInsetsListener:
myView.setOnApplyWindowInsetsListener { view, insets -> {
val statusBarSize = insets.systemWindowInsetTop
return insets
}
Run Code Online (Sandbox Code Playgroud)
这是在API 20中添加的,也是通过ViewAppCompat向后移植的.
and*_*per 33
我将一些解决方案合并在一起:
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);
}
Run Code Online (Sandbox Code Playgroud)
另一种选择:
final View view = findViewById(android.R.id.content);
runJustBeforeBeingDrawn(view, new Runnable() {
@Override
public void run() {
int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:runJustBeforeBeingDrawn的替代方案:https://stackoverflow.com/a/28136027/878126
Ras*_*hid 26
根据谷歌设计指南 ; 状态栏的高度为24 dp.
如果您想获得状态栏高度(以像素为单位),可以使用以下方法:
private static int statusBarHeight(android.content.res.Resources res) {
return (int) (24 * res.getDisplayMetrics().density);
}
Run Code Online (Sandbox Code Playgroud)
可以通过以下活动调用:
statusBarHeight(getResources());
Run Code Online (Sandbox Code Playgroud)
Par*_*han 18
这也适用于参考链接
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
cry*_*sxd 15
默认高度曾经是25dp.使用Android Marshmallow(API 23),高度降低到24dp.
ben*_*lau 13
我有同样的问题,必须在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;
Run Code Online (Sandbox Code Playgroud)
在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;
}
Run Code Online (Sandbox Code Playgroud)
看到:
http://developer.android.com/reference/android/util/DisplayMetrics.html http://developer.android.com/guide/practices/ui_guidelines/icon_design.html
小智 12
是的,当我尝试使用View它提供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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
结合两个最佳解决方案的 Kotlin 版本
fun getStatusBarHeight(): Int {
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
return if (resourceId > 0) resources.getDimensionPixelSize(resourceId)
else Rect().apply { window.decorView.getWindowVisibleDisplayFrame(this) }.top
}
Run Code Online (Sandbox Code Playgroud)
status_bar_height值(如果存在)status_bar_height不存在,则根据 Window 装饰计算状态栏高度试试这个:
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 );
Run Code Online (Sandbox Code Playgroud)
它在活动的onCreate方法中对我没有用,但当我把它放在onClickListener并给我测量25时
为了解决这个问题,我使用了组合方法。这是必要的,因为在平板电脑上,当 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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
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>
Run Code Online (Sandbox Code Playgroud)
你可以在源代码中找到答案:frameworks\base\core\res\res\values\dimens.xml
| 归档时间: |
|
| 查看次数: |
326378 次 |
| 最近记录: |