Я создал фон окна, используя список слоев, где я центрирую элемент (растровое изображение), используя 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>
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>
Я использовал этот фрагмент кода для выравнивания фонового изображения с изображением активности:
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
}
}
}
Не работает вообще и не объясняет, почему это вообще будет.