Androidのステータスバーの高さは?いつも同じですか?
私の測定では25dpだそうですが、全プラットフォームで同じ高さかどうかはわかりません。
(ステータスバーを持たないアクティビティから行うアクティビティへのフェードトランジションを適切に実装するためにこれを知りたい)
この質問は以前に回答されました... ステータスバーの高さは?
更新::
たとえば、画面サイズに応じてステータスバーの高さは異なります。たとえば、画面サイズが240 x 320のデバイスではステータスバーの高さは20ピクセル、画面サイズが320 x 480のデバイスの場合はステータスバーの高さは25ピクセルです。ステータスバーの高さが480 x 800のデバイスは38ピクセルでなければなりません
だから私はステータスバーの高さを取得するためにこのスクリプトを使用することをお勧めします
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);
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;
}
ステータスバーの高さを取得するために使用したすべてのコードサンプルのうち、実際には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;
}
どうやらステータスバーの実際の高さは、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
サイズをハードコーディングする、またはstatus_bar_height
の値を取得するためにリフレクションを使用することは悪い習慣と考えられています。 Chris Banes がDroidcon New Yorkでこれについて話しました 。ステータスバーのサイズを取得するための推奨される方法は OnApplyWindowInsetsListener です。
myView.setOnApplyWindowInsetsListener { view, insets -> {
val statusBarSize = insets.systemWindowInsetTop
return insets
}
これはAPI 20で追加され、 ViewAppCompat を介してバックポートされています。
いくつかの解決策をまとめました。
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);
}
もう一つの選択肢:
final View view = findViewById(Android.R.id.content);
runJustBeforeBeingDrawn(view, new Runnable() {
@Override
public void run() {
int statusBarHeight = getResources().getDisplayMetrics().heightPixels - view.getMeasuredHeight();
}
});
編集:runJustBeforeBeingDrawnの代替: https://stackoverflow.com/a/28136027/878126
Googleのデザインガイドライン によると。ステータスバーの高さは24 dpです。
ステータスバーの高さをピクセル単位で取得したい場合は、以下の方法を使用できます。
private static int statusBarHeight(Android.content.res.Resources res) {
return (int) (24 * res.getDisplayMetrics().density);
}
これはactivityから呼び出すことができます。
statusBarHeight(getResources());
これは参照 リンク でも機能します。
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.htmlhttp:// developer.Android.com/guide/practices/ui_guidelines/icon_design.html
公式の身長は、Googleの Android Design Webページ で公式に述べられているように、24dp
です。
デフォルトの高さは25dpでした。 Androidマシュマロ(API 23)では、高さは24dpに減少しました。
更新:ノッチとパンチカメラの時代が始まって以来、ステータスバーに静的な高さを使用することはもはや機能しないことに注意してください。代わりにウィンドウインセットを使用してください。
はい、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);
}
}
}
}
240 x 320 - 20 px
320x480 - 25px
480x800 + - 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>
答えはソースコードにあります。frameworks\base\core\res\res\values\dimens.xml
これを解決するために、私は組み合わせアプローチを使用しました。これはタブレットでは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;
}
切り替えフルスクリーンソリューション:
この解決策は回避策のように見えるかもしれませんが、それは実際にあなたのアプリがフルスクリーン(別名ステータスバーを隠す)かどうかを説明します:
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座標を取得します。
楽しい
Android 4.1以降では、ステータスバーが隠れて表示されてもコンテンツのサイズが変更されないように、アプリケーションのコンテンツをステータスバーの後ろに表示するように設定できます。これを行うには、SYSTEM_UI_FLAG_LAYOUT_FULLSCREENを使用してください。アプリが安定したレイアウトを維持するためにSYSTEM_UI_FLAG_LAYOUT_STABLEを使用する必要があるかもしれません。
この方法を使用するときは、アプリのUIの重要な部分(たとえば、Mapsアプリケーションの組み込みコントロール)がシステムバーで覆われないようにする必要があります。これにより、アプリが使用できなくなる可能性があります。ほとんどの場合、これを処理するには、trueに設定したAndroid:fitsSystemWindows属性をXMLレイアウトファイルに追加します。これにより、親ViewGroupの余白が調整され、システムウィンドウ用のスペースが確保されます。ほとんどのアプリケーションではこれで十分です。
ただし、場合によっては、アプリに適したレイアウトにするためにデフォルトの余白を変更する必要があります。システムバー(ウィンドウの「コンテンツインセット」として知られているスペースを占める)に対するコンテンツのレイアウト方法を直接操作するには、fitSystemWindows(Rectインセット)をオーバーライドします。 fitSystemWindows()メソッドは、ウィンドウの内容インセットが変更されたときにビュー階層によって呼び出され、それに応じてウィンドウがその内容を調整できるようにします。このメソッドをオーバーライドすることで、あなたが望むインセット(そしてあなたのアプリのレイアウト)を扱うことができます。
フォーム: https://developer.Android.com/training/system-ui/status.html#behind
@ Niklas +1のおかげで、これが正しい方法です。
public class MyActivity extends Activity implements Android.support.v4.View.OnApplyWindowInsetsListener {
Rect windowInsets;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
View rootview = findViewById(Android.R.id.content);
Android.support.v4.View.ViewCompat.setOnApplyWindowInsetsListener(rootview, this);
}
Android.support.v4.View.WindowInsetsCompat Android.support.v4.View.OnApplyWindowInsetsListener.OnApplyWindowInsets(View v, Android.support.v4.View.WindowInsetsCompat insets)
{
windowInsets = new Rect();
windowInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
//StatusBarHeight = insets.getSystemWindowInsetTop();
//Refresh/Adjust view accordingly
return insets;
}
}
Xamarin C#から変換したコードが100%正しくない場合は申し訳ありませんが、これだけです。ノッチなどで動作します.
あなたが正確にサイズ対高さを知っていれば
好き
たとえば、320 x 480の画面サイズのデバイスではステータスバーの高さは25ピクセル、480 x 800のデバイスではステータスバーの高さは38ピクセルです。
ステータスバーの高さを取得するには、if else文を使用するだけでビューの幅/画面サイズを取得できます。
一部の人にとって一番の答えがうまくいかないのは、レンダリングの準備ができるまでビューの寸法を取得できないためです。実際に次のことができる場合は、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
}
}
}
これが最も信頼できる方法です。
私のPixel 3 XLのノッチのために、この問題は最近私にとって重要になりました。私は本当に Android開発者の解決策 が好きでしたが、フルスクリーンアニメーションには特に必要だったので、ステータスバーの高さを自由に取得できるようにしたいと思いました私がプレーする必要がありました。以下の機能は信頼できる問い合わせを可能にしました:
private val DEFAULT_INSET = 96
fun getInsets(view: View?): Int {
var inset = DEFAULT_INSET
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//Safe because only P supports notches
inset = view?.rootWindowInsets?.stableInsetTop ?: DEFAULT_INSET
}
return inset
}
fun blurView(rootView: View?, a: SpacesActivity?) {
val screenBitmap = getBitmapFromView(rootView!!)
val heightDifference = getInsets(rootView)
val croppedMap = Bitmap.createBitmap(
screenBitmap, 0, heightDifference,
screenBitmap.width,
screenBitmap.height - heightDifference)
val blurredScreen = blurBitmap(croppedMap)
if (blurredScreen != null) {
val myDrawable = BitmapDrawable(a!!.resources, blurredScreen)
a.errorHudFrameLayout?.background = myDrawable
a.appBarLayout?.visibility = View.INVISIBLE
}
}
そして活動クラスでは:
fun blurView() {
this.runOnUiThread {
Helper.blurView(this)
}
}
もちろん、アクティビティの弱い参照を静的なHelperクラスメソッドのパラメータに渡したいと思うでしょうが、簡潔にするためにこの例では控えています。 blurBitmap
とerrorHudFrameLayout
は、ステータスバーの高さの取得に直接関係しないため、同じ理由で省略されています。