在Android启动活动中为windowBackground保持正确的宽高比

时间:2019-07-07 20:25:40

标签: android android-activity splash-screen launch aspect-ratio

我正在努力在我的项目中实施启动活动。目前,启动活动已完美加载,并且在加载图像之前没有“白色闪光”-很好。

我唯一的问题是保持初始屏幕图像的正确纵横比

这是我用于SplashActivity的主题

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash</item>
</style>

splash.xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/pink_grid"
        android:gravity="fill_vertical|clip_horizontal"
/>

这是我得到的结果的屏幕截图:

Improper Aspect Ratio

我用作背景的黑色/粉红色网格图像具有统一的正方形。从图像中可以看到,它没有保持适当的宽高比(被水平挤压)。

这是网格图像(1280x1920):

Pink and black grid image

我尝试过的事情:

似乎唯一控制飞溅窗口背景长宽比的方法是使用gravity。我尝试垂直填充图像并水平裁剪。但这并不能保持纵横比。

如何调整初始图像的重力以保持宽高比并使屏幕适合任何设备?

编辑:基于Raz的回答的进度:

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/pink_grid" android:scaleType="centerCrop"/>
</merge>

SplashActivity.kt

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

//        val intent = Intent(this, MainActivity::class.java)
//        startActivity(intent)
//        finish()
    }
}

AndroidManifest.xml

<application>
    <!-- ... -->
    <activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

styles.xml

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

初始屏幕现在只是黑屏。粉色/黑色网格未显示。

2 个答案:

答案 0 :(得分:0)

AFAIK,windowBackground将始终填充屏幕。 您需要做的是:

将活动的布局设置为:

<FrameLayout 
        android:width="match_parent" 
        android:height="match_parent">
    <ImageView  
android:width="match_parent"  
android:height="match_parent"  
android:ScaleType="CENTER_CROP"  android:src="your_image"/>
        </FrameLayout>

imageView属性的比例类型将保留长宽比。

作为优化:

  1. 将windowBackground设置为透明(以减少透支)
  2. 将根FrameLayout更改为<merge>-就像这样:

<merge> <ImageView
android:width="match_parent"
android:height="match_parent"
android:ScaleType="CENTER_CROP" android:src="your_image"/> </merge>

答案 1 :(得分:0)

使用矢量可绘制时,以下效果很好:

drawable / splash.xml

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