programing

액션바의 크기는 픽셀 단위로 어떻게 됩니까?

abcjava 2023. 9. 13. 22:16
반응형

액션바의 크기는 픽셀 단위로 어떻게 됩니까?

정확한 배경 이미지를 적용하기 위해서는 픽셀 단위의 ActionBar의 정확한 크기를 알아야 합니다.

XML에서 ActionBar의 높이를 검색하려면 다음을 사용합니다.

?android:attr/actionBarSize

또는 ActionBarSherlock 또는 AppCompat 사용자인 경우 다음을 사용합니다.

?attr/actionBarSize

런타임에 이 값이 필요한 경우 이 값을 사용합니다.

final TypedArray styledAttributes = getContext().getTheme().obtainStyledAttributes(
                    new int[] { android.R.attr.actionBarSize });
mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();

이 정의 위치를 이해해야 하는 경우:

  1. 속성 이름 자체가 플랫폼의 /res/values/attrs.xml에 정의되어 있습니다.
  2. 플랫폼의 테마.xml은 이 특성을 선택하고 값을 할당합니다.
  3. 2단계에서 할당되는 값은 플랫폼의 다양한 dimens.xml 파일, core/res/res/values-sw600dp/dimens.xml에 정의된 다양한 디바이스 크기에 따라 달라집니다.

안드로이드 3.2의 디컴파일된 소스로부터framework-res.apk,res/values/styles.xml포함 내용:

<style name="Theme.Holo">
    <!-- ... -->
    <item name="actionBarSize">56.0dip</item>
    <!-- ... -->
</style>

3.0과 3.1은 (적어도 AOSP에서) 동일한 것 같습니다.

Actionbar의 실제 높이를 얻으려면 속성을 확인해야 합니다.actionBarSize해질녘에

TypedValue tv = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId);

Honeycomb 샘플 중 하나는 다음과 같습니다.?android:attr/actionBarSize

ICS 이전 호환 앱에서 이러한 높이를 적절히 복제하고 프레임워크 코어 소스를 조사해야 했습니다.위의 두 답변 모두 다소 맞습니다.

그것은 기본적으로 예선전을 사용하는 것으로 요약됩니다.높이는 "action_bar_default_height" 차원으로 정의됩니다.

기본값의 경우 48dip으로 정의됩니다.그러나 육지의 경우 40 dip이고 sw600 dp의 경우 56 dip입니다.

최근 v7 app compat 지원 패키지의 호환성 ActionBar를 사용하는 경우 다음을 사용하여 높이를 얻을 수 있습니다.

@dimen/abc_action_bar_default_height

문서화

v7 지원 라이브러리(21.0.0)를 사용하면 이름이R.dimen@dimen/dimens_action_bar_default_height_material로 변경되었습니다.

이전 버전의 support lib에서 업그레이드할 때는 이 값을 작업 표시줄의 높이로 사용해야 합니다.

ActionBarSherlock을 사용하는 경우 다음과 같이 높이를 얻을 수 있습니다.

@dimen/abs__action_bar_default_height

@AZ13의 답변은 좋으나 Android 설계 지침에 따르면 ActionBar는 48dp 이상이어야 합니다.

Kotlin에서 수락된 답변:

val Context.actionBarSize
    get() = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
        .let { attrs -> attrs.getDimension(0, 0F).toInt().also { attrs.recycle() } }

용도:

val size = actionBarSize                    // Inside Activity
val size = requireContext().actionBarSize   // Inside Fragment
val size = anyView.context.actionBarSize    // Inside RecyclerView ViewHolder
public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv,
                true))
            actionBarHeight = TypedValue.complexToDimensionPixelSize(
                    tv.data, getResources().getDisplayMetrics());
    } else {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,
                getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

클래스 요약은 일반적으로 시작하기에 좋습니다.getHeight() 방법으로 충분하다고 생각합니다.

편집:

폭이 필요하시면 화면의 폭(맞습니까?)이 되어야 하고, 이렇게 모이면 됩니다.

441dpi > 1080 x 1920 > getResources()로 액션바 높이 얻기. getDimensionPixelSize 144픽셀을 받았습니다.

px x (를 는 formula px dp x (dpi/160) 를 하여 한 441dpi 하지 는 를 하지 는 한 하여
480dpi 카테고리에서. 됩니다.그래서 퍼팅을 하면 결과가 확인됩니다.

저는 제 자신을 위해 이 방법을 사용했는데, 이 도우미 방법은 누군가에게 도움이 될 것입니다.

private static final int[] RES_IDS_ACTION_BAR_SIZE = {R.attr.actionBarSize};

/**
 * Calculates the Action Bar height in pixels.
 */
public static int calculateActionBarSize(Context context) {
    if (context == null) {
        return 0;
    }

    Resources.Theme curTheme = context.getTheme();
    if (curTheme == null) {
        return 0;
    }

    TypedArray att = curTheme.obtainStyledAttributes(RES_IDS_ACTION_BAR_SIZE);
    if (att == null) {
        return 0;
    }

    float size = att.getDimension(0, 0);
    att.recycle();
    return (int) size;
}

언급URL : https://stackoverflow.com/questions/7165830/what-is-the-size-of-actionbar-in-pixels

반응형