Androidのステータスバーの高さは?いつも同じですか?
私の測定では25 dpのようですが、すべてのプラットフォームで同じ高さであるかどうかはわかりません。
(ステータスバーのないアクティビティからのアクティビティへのフェードトランジションを適切に実装するためにこれを知りたい)
Androidのステータスバーの高さは?いつも同じですか?
私の測定では25 dpのようですが、すべてのプラットフォームで同じ高さであるかどうかはわかりません。
(ステータスバーのないアクティビティからのアクティビティへのフェードトランジションを適切に実装するためにこれを知りたい)
回答:
この質問は以前に回答されました... ステータスバーの高さ?
更新 ::
ステータスバーの高さは画面サイズに依存します。たとえば、240 X 320の画面サイズのデバイスでは、ステータスバーの高さは20ピクセルです。320X 480の画面サイズのデバイスでは、ステータスバーの高さは25ピクセルです。ステータスバーの高さが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);
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;
}
window.getDecorView().getWindowVisibleDisplayFrame(rectangle)
マルチウィンドウモード+縦向き回転+ 2番目のウィンドウの場合、ステータスバーの高さを取得する正しい方法ではありません。あなたは巨大な価値を得るでしょう(最初の高さを含む)。
ステータスバーの高さを取得するために使用したすべてのコードサンプルのうち、実際にの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);
}
これは以下のアクティビティから呼び出すことができます:
statusBarHeight(getResources());
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
公式の高さは24dp
、GoogleがAndroid Designウェブページで公式に述べているとおりです。
はい、ビューで試してみると、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);
}
}
}
}
これを試して:
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では24 dpです。
<!-- 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
@android:dimen/status_bar_height
私のために動作しません
これを解決するために、私は組み合わせアプローチを使用しました。タブレットでは、display.getHeight()が呼び出されたときにシステムバーがすでにピクセルを減算しているため、これは必要です。そこで、まずシステムバーが存在するかどうかを確認してから、ベンクレイトンズのアプローチを採用します。これは、電話で問題なく機能します。
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;
}
@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;
}
}
コードが100%正しくなく、Xamarin C#から変換したものである場合は失礼しますが、これはそれだけです。ノッチなどで動作します
フルスクリーンソリューションの切り替え:
この解決策は回避策のように見えるかもしれませんが、実際にはアプリがフルスクリーン(別名ステータスバーを非表示)かどうかを考慮しています:
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の重要な部分(マップアプリケーションの組み込みコントロールなど)がシステムバーで覆われないようにするのは、ユーザーの責任になります。これにより、アプリが使用できなくなる可能性があります。ほとんどの場合、これを処理するには、android:fitsSystemWindows属性をXMLレイアウトファイルに追加し、trueに設定します。これにより、親ViewGroupのパディングが調整され、システムウィンドウ用のスペースが確保されます。ほとんどのアプリケーションではこれで十分です。
ただし、アプリの目的のレイアウトを取得するために、デフォルトのパディングを変更する必要がある場合もあります。システムバー(ウィンドウの「コンテンツインセット」と呼ばれるスペースを占める)を基準にしてコンテンツのレイアウトを直接操作するには、fitSystemWindows(Rect insets)をオーバーライドします。ウィンドウのコンテンツインセットが変更されたときにビューの階層によってfitSystemWindows()メソッドが呼び出され、ウィンドウがそれに応じてコンテンツを調整できるようになります。このメソッドをオーバーライドすることで、インセット(およびアプリのレイアウト)を必要に応じて処理できます。
フォーム:https : //developer.android.com/training/system-ui/status.html#behind
サイズと高さを正確に知っている場合
お気に入り
たとえば、画面サイズが320 X 480のデバイスでは、ステータスバーの高さは25ピクセル、480 x 800のデバイスでは、ステータスバーの高さは38ピクセルである必要があります。
次に、ビューの幅/画面サイズを取得できます。ifelseステートメントを使用して、ステータスバーの高さを取得できます。
トップ回答が一部の人にとってうまくいかない理由は、レンダリングの準備ができるまでビューのサイズを取得できないためです。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
}
}
}
これが最も信頼できる方法です。
現在マルチウィンドウモードが利用可能であるため、アプリの上部にステータスバーがない場合があります。
以下のソリューションは、すべてのケースを自動的に処理します。
android:fitsSystemWindows="true"
またはプログラム的に
findViewById(R.id.your_root_view).setFitsSystemWindows(true);
ルートビューを取得することもできます
findViewById(android.R.id.content).getRootView();
or
getWindow().getDecorView().findViewById(android.R.id.content)
ルートビューの取得の詳細については、https://stackoverflow.com/a/4488149/9640177を参照してください
この問題は、Pixel 3XLにノッチがあるため、最近私に関連するものになりました。私は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
それらは直接、ステータスバーの高さを得ることに関係しないので、同じ理由のために省略されています。
2つの最適なソリューションを組み合わせた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
}
status_bar_height
存在する場合は値を取りますstatus_bar_height
存在しない場合、ウィンドウ装飾からステータスバーの高さを計算します