Как сопоставить центрирование RelativeLayout (centerInParent) и списка слоев (гравитация: центр) как windowBackground?

Я создал фон окна, используя список слоев, где я центрирую элемент (растровое изображение), используя android:gravity = "center". Затем я показываю то же изображение, но с использованием относительного макета с ImageView, и оно центрируется с помощью android:layout_centerInParent = "true". Однако изображение в относительной компоновке немного выше. Как их центрировать, чтобы они были в одном положении?

Список слоев как windowBackground в файле splash_background:

<layer-list xmlns:android = "http://schemas.android.com/apk/res/android">
    <item android:drawable = "@color/appBackground" />
    <item>
        <bitmap
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:gravity = "center"
            android:src = "@raw/splash_animated" />
    </item>
</layer-list>

Действия с этим относительным макетом (используя стиль ниже):

<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical"
    tools:context = ".LaunchAnimatedActivity">

    <ImageView
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_centerInParent = "true"
        android:src = "@raw/splash_animated" />

</RelativeLayout>

Стиль:

<style name = "AppTheme.FullscreenSplash" parent = "AppTheme.NoActionBar">
        <item name = "android:windowFullscreen">true</item>
        <item name = "android:windowContentOverlay">@null</item>
        <item name = "android:windowBackground">@drawable/splash_background</item>
        <item name = "android:windowAnimationStyle">@null</item>
</style>
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Frame Layout — это решение.

<FrameLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent">

<ImageView
    android:src = "@drawable/splash"
    android:layout_gravity = "center"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"/>

    android:adjustViewBounds = "true"
    android:scaleType = "fitXY"

</FrameLayout>

Не работает вообще и не объясняет, почему это вообще будет.

TheLibrarian 18.10.2022 10:34
Ответ принят как подходящий

Я использовал этот фрагмент кода для выравнивания фонового изображения с изображением активности:

val statusBar = resources.getIdentifier("status_bar_height", "dimen", "android")
if (statusBar != 0) {
    //getting statusbar height
    val statusBarHeight = resources.getDimensionPixelSize(statusBar)
    val imageView = findViewById<ImageView>(R.id.splash_image)
    // using FrameLayout instead of RelativeLayout
    imageView.updateLayoutParams<FrameLayout.LayoutParams>
    {
        //orientation aware
        if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            leftMargin = statusBarHeight
        } else {
            topMargin = statusBarHeight
        }
    }
}

Другие вопросы по теме