programing

Android의 상태 표시줄 높이

instargram 2023. 9. 14. 21:38
반응형

Android의 상태 표시줄 높이

안드로이드에서 상태 표시줄의 높이는 얼마입니까?항상 똑같습니까?

제가 측정한 바로는 25dp로 보이는데, 모든 플랫폼에서 높이가 같은지는 잘 모르겠습니다.

(상태 표시줄이 없는 활동에서 상태 표시줄이 있는 활동으로 페이드 전환을 적절하게 구현하기 위해 알고 싶습니다.)

이 문제는... 전에 대답했습니다.상태 표시줄의 높이?

업데이트::

현재 메서드:

상태 표시줄의 높이는 화면 크기에 따라 달라집니다. 예를 들어 240X320 화면 크기의 장치에서는 상태 표시줄의 높이가 20px이고, 320X480 화면 크기의 장치에서는 상태 표시줄의 높이가 25px이고, 480x800의 장치에서는 상태 표시줄의 높이가 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); 

Method b) 를 합니다 의 합니다 를 의 .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;
} 

에서 실제로 하는 것으로 은 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ,onCreateActivity이것은:

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

상태 표시줄의 실제 높이는 안드로이드 리소스로 유지됩니다.의는에 a될수aoede수에의될ea는eContextWrapper들어,급)(Activity).

http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/ 에서 찾을 수 있습니다.

하여 λ λ λ .status_bar_height나쁜 관행으로 여겨집니다.Chris Banes가 Droidcon New York에서 이것에 대해 이야기 했습니다.상태 표시줄 크기를 가져오는 권장 방법은 OnApplyWindowIntsListener를 통해 다음과 같습니다.

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

이는 API 20에 추가되었으며 ViewAppCompat을 통해서도 백포트됩니다.

MDPI 장치에서 상태 표시줄은 25px입니다.이를 기본으로 사용하고 밀도(반올림)를 곱하여 모든 장치에서 상태 표시줄 높이를 얻을 수 있습니다.

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

참고: ldpi=.75, mdpi=1, hdpi=1.5, xhdpi=2

몇 가지 솔루션을 통합했습니다.

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();
        }
    });

편집: 그리기 직전에 실행할 대안: https://stackoverflow.com/a/28136027/878126

재료 안내서에 따르면 상태 표시줄의 높이는 24dp입니다.

상태 표시줄 높이를 픽셀 단위로 얻으려면 아래 방법을 사용할 수 있습니다.

private static int statusBarHeight(android.content.res.Resources res) {
    return (int) (24 * res.getDisplayMetrics().density);
}

다음과 같은 활동에서 호출할 수 있습니다.

statusBarHeight(getResources());

기본 높이는 25dp였습니다.Android Marshmallow(API 23)를 사용하면 높이가 24dp로 낮아졌습니다.

업데이트: 노치와 펀치 홀 카메라 시대가 시작된 이후로 상태 표시줄에 정적 높이를 사용하는 것은 더 이상 작동하지 않습니다.대신 창 삽입구를 사용해주세요!

참조 링크에서도 작동합니다.

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}

24dp, 구글이 안드로이드 디자인 웹페이지에 공식적으로 밝힌 바와 같이.

두 가지 최상의 솔루션을 결합한 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
}
  1. 걸린다status_bar_height있는 경우 값는값
  2. 한다면status_bar_height 윈도우 음우서태줄를w다를줄serm,tsl태지t서우t음r,

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);
            }
        }
    }
}

240x320 - 20px

320x480 - 25fps

480x800+ - 38fps

시도해 보기:

    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로 했을 때는 작동했습니다.

상태 표시줄의 높이는 안드로이드 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 소스 코드에서 답을 찾을 수 있습니다.

이를 해결하기 위해 조합 방식을 사용했습니다.이는 태블릿의 경우 시스템 바에서 디스플레이할 때 픽셀을 이미 뺀 상태이기 때문에 필요합니다.높이()가 호출됩니다.그래서 먼저 시스템 바가 있는지 확인하고, 그 다음에 벤 클레이튼스가 접근합니다. 전화기에서 잘 작동합니다.

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();

이렇게 하면 앱이 현재 전체 화면이면barheight0.0 ㎠와 같습니다.

개인적으로 상태 표시줄을 설명하기 위해 절대 터치 이벤트 좌표를 수정해야 했습니다.

@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좌표를 얻을 것입니다.

즐거운 시간 되세요.

일부 사용자에게 최상위 답변이 적용되지 않는 이유는 렌더링 준비가 될 때까지 뷰의 치수를 얻을 수 없기 때문입니다.용을 합니다.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 4.1 이상에서는 상태 표시줄 뒤에 응용 프로그램의 내용이 나타나도록 설정하여 상태 표시줄이 숨기고 표시되는 대로 내용 크기가 조정되지 않도록 할 수 있습니다.이렇게 하려면 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN을 사용합니다.또한 SYSTEM_UI_FLAG_LAYOUT_STABLE을 사용하여 안정적인 레이아웃을 유지할 수 있습니다.

이 방법을 사용할 때는 앱 UI의 중요한 부분(예: 지도 응용 프로그램의 내장 컨트롤)이 시스템 막대에 의해 가려지지 않도록 하는 것이 사용자의 책임입니다.이로 인해 앱을 사용할 수 없게 될 수 있습니다.대부분의 경우 true로 설정된 XML 레이아웃 파일에 Android:fitsSystemWindows 특성을 추가하면 이 문제를 해결할 수 있습니다.그러면 상위 ViewGroup의 패딩을 조정하여 시스템 창의 공간을 확보할 수 있습니다.이 정도면 대부분의 응용 프로그램에서 충분합니다.

그러나 경우에 따라 앱에 필요한 레이아웃을 얻으려면 기본 패딩을 수정해야 할 수도 있습니다.창의 "내용 삽입 세트"로 알려진 공간을 차지하는 시스템 막대와 관련하여 내용이 배치되는 방법을 직접 조작하려면 SystemWindows(Rect insets)를 재정의합니다.fitSystemWindows() 메서드는 창에 대한 내용 집합이 변경된 경우 보기 계층에서 호출하여 창에서 내용을 적절히 조정할 수 있도록 합니다.이 방법을 재정의함으로써 원하는 대로 삽입(그리고 따라서 앱의 레이아웃)을 처리할 수 있습니다.

양식 : https://developer.android.com/training/system-ui/status.html#behind

사이즈 VS 키를 정확히 알고 계신다면

맘에 들다

예를 들어 320 X 480 화면 크기의 장치에서는 상태 표시줄 높이가 25px이고, 480 x 800의 장치에서는 상태 표시줄 높이가 38px여야 합니다.

그러면 보기의 너비/화면 크기를 얻을 수 있습니다. if other 문을 사용하여 상태 표시줄의 높이를 얻을 수 있습니다.

멀티 윈도우 모드를 사용할 수 있기 때문에, 당신의 앱은 상단에 상태 표시줄이 없을 수도 있습니다.

다음 솔루션은 모든 케이스를 자동으로 처리합니다.

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)

root-view 가져오기에 대한 자세한 내용은 https://stackoverflow.com/a/4488149/9640177 을 참조하십시오.

이 문제는 최근 픽셀 3XL의 노치 때문에 저와 관련이 있습니다.는 안드로이드 개발자의 솔루션이 정말 마음에 들었지만, 제가 플레이해야 하는 풀 스크린 애니메이션에 특히 필요했기 때문에, 저는 마음대로 상태 표시줄 높이를 얻을 수 있기를 원했습니다.아래 기능을 통해 신뢰할 수 있는 쿼리가 가능해졌습니다.

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)
    }
}

물론 활동에 대해 static Helper class method parameter에 대한 약한 참조를 전달하고 싶겠지만, 간결한 설명을 위해 나는 이 예에서 자제했습니다.blurBitmap그리고.errorHudFrameLayout상태 표시줄의 높이를 구하는 것과 직접 관련이 없으므로 같은 이유로 생략합니다.

언급URL : https://stackoverflow.com/questions/3407256/height-of-status-bar-in-android

반응형