SplashScreen с вектором растягивается на весь экран

Я сделал свой заставку с помощью этого урока, и он отлично работает. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ В основном я создал splascreen через тему:

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

Я хотел бы разместить векторное изображение внутри так:

(drawable_splashcreen)

<item android:drawable="@color/color_background_splash_screen" />

<item
    android:drawable="@drawable/vector_najdiflet_logo"

    />

Изображение будет растянуто по всему экрану. В API 23 он работает так, как должен. Но на более старых устройствах он просто растягивается. Я попробовал ширину, высоту и даже испортил видовые экраны, но не успел. Любое исправление для этого?

Ответ 1

В полноэкранном всплеске попробуйте использовать:

android:gravity="fill_horizontal|fill_vertical"

Если не разрешить, возможно, решение создает отдельные изображения для каждого размера разрешения.


Наиболее распространенные разрешения:

  • Small = 240 x 320px (ldpi)
  • Medium = 320 x 480px (mdpi)
  • Large = 480 x 800px (hdpi)
  • xLarge = 640 x 960px (xhdpi)

Портретный формат:

  • ldpi = 240 x 360px (0,75 x mdpi)
  • mdpi = 320 x 480 пикселей (базовая плотность)
  • hdpi = 480 x 720px (1,5 x mdpi)
  • xhdpi = 640 x 960px (2 x mdpi)
  • xxhdpi = 960 x 1440px (3 x mdpi)
  • xxxhdpi = 1080 x 1920px (4 x mdpi)

Ландшафтный формат (инвертированный портретный формат):

  • ldpi = 360 x 240px (0,75 x mdpi)
  • mdpi = 480 x 320 пикселей (базовая плотность)
  • hdpi = 720 x 480px (1,5 x mdpi)
  • xhdpi = 960 x 640px (2 x mdpi)
  • xxhdpi = 1440 x 960px (3 x mdpi)
  • xxxhdpi = 1920 x 1080px (4 x mdpi)

Подробнее о вас можно найти здесь:

Ответ 2

Я наткнулся на ту же проблему. К сожалению, кажется, что нет возможности заставить заставку работать только с вектором, который можно нарисовать для предварительного API 23.

Проблема в том, что вы не можете загрузить VectorDrawableCompat вне процесса, как в этом случае в ваших темах android: windowBackground. Таким образом, здесь, вероятно, происходит то, что в API 21 вектор преобразуется в PNG для совместимости. Таким образом, в <layered-list> преобразованный PNG вставляется в <item>, что заставляет растровое изображение растягиваться по всем краям, потому что в нем отсутствует элемент <bitmap>.

Итак, мое решение заключается в следующем:

Создайте drawable_splashscreen.xml внутри папки drawables-v23 которая выглядит следующим образом для векторного рисования

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

    <item android:drawable="?attr/colorPrimary"/>

    <item android:drawable="@drawable/ic_splashscreen" android:gravity="center"/>

</layer-list>

Затем создайте еще один drawable_splashscreen.xml но внутри обычной папки drawables

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

    <item android:drawable="?attr/colorPrimary"/>

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

</layer-list>

Обратите внимание на элемент <bitmap>. Так что теперь, когда PNG используется на устройствах до API 23, он будет отображаться правильно и не будет растянут на весь фон. К сожалению, вы также должны предоставить заставку в формате PNG, чтобы это работало в старых API. Но для каждого устройства с API 23+ будет использоваться векторное изображение.

Надеюсь, что этот ответ может помочь тому, кто работает в той же проблеме!

Ответ 3

Используйте растровое изображение и определите свое изображение в src. Установите гравитацию в центр

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

    <item android:drawable="@color/color_background_splash_screen"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_logo_splash"/>
    </item>
</layer-list>

заставка

Ответ 4

Я не думаю, что это возможно сделать с векторами, для устройств < API 23, так как невозможно установить атрибуты android: height и android: width на drawable.

Чтобы реализовать мой заставку с центрированным значком, мне пришлось экспортировать вектор моего логотипа в .png для каждого размера экрана и вставлять растровое изображение в список слоев:

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

    <item
        android:left="20dp"
        android:right="20dp">
        <bitmap
            android:gravity="center"
            android:scaleType="centerInside"
            android:src="@drawable/logo_rasterised" />
    </item>

</layer-list>

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

Ответ 5

Ссылаясь на ссылку, которую вы указали, вам не хватает коэффициента гравитации:

  <bitmap
        **android:gravity="center"**
        android:src="@mipmap/ic_launcher"/>

Ответ 6

** Привет, вы можете попробовать этот код:

window.getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_FULLSCREEN
    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Это все.

Ответ 7

Не помещайте свое изображение в окно: Background (style.xml),

вместо

добавить изображение в файл макета, например,

  <ImageView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:src="@drawable/vector_najdiflet_logo"
      android:scaleType="centerCrop"/>

попробуйте изменить,

android:scaleType="centerInside"

Ответ 8

Не помещайте свое изображение в окно: Фон, вместо этого добавьте в качестве андроида: src для изображения для макета SplashScreenActivity.