使用Activity ImageView将Android WindowBackground居中

Fra*_*ois 10 android splash-screen

语境

第1步:目前,我有一个活动android:windowBackground可用来设置初始背景,而我们需要等待该活动加载。这将加载应居中对齐的位图。

第二步:一旦活动被载入它的简单setContentView设置为现在将取代该活动的背景android:windowBackground,从第一步。这将加载一个imageView应居中对齐的。

问题在于它们不是都对齐中心,一个或另一个在它们上未对齐。Maby状态栏推下一个吗?我不确定。有什么想法为什么他们不一样吗?

我希望它们都居中对齐。我尝试使用fitSystemWindows="true"没有运气。

当我添加android:layout_marginTop="12dp"到活动(activity_start_onboarding.xml)布局时,imageView 两者都可以很好地对齐,但并非对于所有密度都可以对齐,其他密度则不能对齐。

Maby有一种方法可以动态计算此偏移量,然后针对所有密度进行对齐?


比较图片

左(灰色)-步骤1(windowBackground):
右(蓝色)-步骤2(活动布局): 在此处输入图片说明


代码

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>
Run Code Online (Sandbox Code Playgroud)

styles.xml

<style name="ColdstartSplashTheme" parent="SuperbalistTheme.Dark">
    <item name="android:windowBackground">@drawable/splash_background</item>
</style>
Run Code Online (Sandbox Code Playgroud)

@ 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>
Run Code Online (Sandbox Code Playgroud)

ActivityStartOnboarding.java

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

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>
Run Code Online (Sandbox Code Playgroud)

Ily*_*rov 7

android:fitsSystemWindows="true"
Run Code Online (Sandbox Code Playgroud)

那是你的问题。您的FrameLayout在状态栏下开始膨胀,高度约为25dp,因此AppCompatImageView会高一些。

第一个解决方案:android:fitsSystemWindows="true"activity_start_onboarding.xmlFrameLayout中删除。

第二种解决方案:添加<item name="android:windowDrawsSystemBarBackgrounds">true</item>到您的中ColdstartSplashTheme。背景会在状态栏下开始绘制,并且位图会更高。