Центр Android WindowBackground с Activity ImageView - PullRequest
0 голосов
/ 03 марта 2019

Context

Step1: В настоящее время у меня есть одно действие, которое использует android:windowBackground, чтобы установить начальный фон, пока мы ожидаем загрузки действия.Это загружает растровое изображение, которое должно быть выровнено по центру.

Step2: Как только действие загружено, оно делает простой setContentView, чтобы установить фон для действия, которое теперь заменит android:windowBackground с step1 .Это загружает imageView, который должен быть выровнен по центру.

Проблема в том, что оба они не выровнены по центру, есть какое-то смещение на одном или другом, смещающее их.Маби статусбар толкает вниз один?Я не уверен.Любые идеи, почему они не совпадают?

Я хотел бы, чтобы они оба были выровнены по центру.Я попытался использовать fitSystemWindows="true" безуспешно.

Когда я добавляю android:layout_marginTop="12dp" к макету активности (activity_start_onboarding.xml) imageView оба выравниваются нормально, но это не выравнивается для всех плотностей, другие плотностивыровнены.

Маби, есть способ динамически рассчитать это смещение, чтобы затем выровнять его для всех плотностей?


Сравнить изображения

Слева (серый) - Step1 (фон окна):
Справа (синий) - Step2 (макет активности): enter image description here


Код

AndroidManifest.xml

<activity android:name=".view.onboarding.ActivityStartOnboarding"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@style/ColdstartSplashTheme">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

styles.xml

<style name="ColdstartSplashTheme" parent="SuperbalistTheme.Dark">
    <item name="android:windowBackground">@drawable/splash_background</item>
</style>

@drawable / splash_background

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/grey_mid_dark" />

<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/ic_delivery_free_raster" />
</item>

ActivityStartOnboarding.java

public class ActivityStartOnboarding extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start_onboarding);
  }
}

activity_start_onboarding.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/blue_light_darker"
        android:fitsSystemWindows="true">

        <androidx.appcompat.widget.AppCompatImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/splash_background" />
    </FrameLayout>
</layout>

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Использовать фон вместо windowBackground

<style name="ColdstartSplashTheme" parent="SuperbalistTheme.Dark">
    <item name="android:background">@drawable/splash_background</item>
</style>
0 голосов
/ 05 марта 2019
android:fitsSystemWindows="true"

Это ваша проблема.Ваш FrameLayout начинает раздуваться в строке состояния, высота которой ~ 25dp, поэтому AppCompatImageView немного выше.

Первое решение: Удалить android:fitsSystemWindows="true" из activity_start_onboarding.xml FrameLayout.

Второе решение: Добавить <item name="android:windowDrawsSystemBarBackgrounds">true</item> к вашему ColdstartSplashTheme.Фон начинает рисоваться под строкой состояния, и растровое изображение будет выше.

...