Поддержание правильного соотношения сторон для WindowBackground на Android-заставке - PullRequest
0 голосов
/ 07 июля 2019

Я работаю над тем, чтобы в моем проекте была реализована заставка. Активность всплеска в настоящее время отлично загружается, и перед загрузкой изображения не возникает "белая вспышка" - и это хорошо.

Моя единственная проблема - поддержание правильного соотношения сторон изображения заставки.

Вот тема, которую я использую для 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. Я попытался заполнить изображение по вертикали и обрезать по горизонтали. Но это не поддерживает соотношение сторон.

Как настроить гравитацию заставки, чтобы сохранить пропорции и установить размер экрана на любом устройстве?

Редактировать: прогресс на основе ответа Раз:

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>

Заставка теперь просто черная. Розовая / черная сетка не отображается.

1 Ответ

0 голосов
/ 07 июля 2019

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<br> android:width="match_parent"<br> android:height="match_parent"<br> android:ScaleType="CENTER_CROP" android:src="your_image"/> </merge>

...