SplashScreen与矢量拉伸全屏

Win*_*lly 39 android splash-screen android-layout android-vectordrawable

我使用本教程完成了启动画面,效果很好.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>
Run Code Online (Sandbox Code Playgroud)

我想把一个矢量图像放在里面:

(drawable_splashcreen)

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

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

    />
Run Code Online (Sandbox Code Playgroud)

图像将在整个屏幕上拉伸.在API 23上,它的工作方式应该如此.但在较旧的设备上它只是拉伸.我尝试了宽度,高度,甚至搞砸了视口但没有成功.对此有任何修复?

小智 17

我偶然发现了同样的问题。不幸的是,似乎没有可能仅使用可用于pre API 23的矢量绘制启动画面。

问题是您不能在进程外部加载VectorDrawableCompat,例如在主题android:windowBackground中。因此,这里可能发生的事情是,在API 21上,将Vector转换为兼容的PNG。因此,在<layered-list>转换后的PNG 中将其插入到<item>元素中,这会导致位图扩展到所有边缘,因为它缺少<bitmap>元素。

所以我的解决方案如下:

drawable_splashscreen.xml在文件夹内部创建一个drawables-v23类似于以下内容的vector drawable

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

然后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:src="@drawable/ic_splashscreen" android:gravity="center"/>
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

注意<bitmap>元素。因此,现在,当在API 23之前的设备上使用PNG时,它将正确显示,并且不会延伸到整个背景。不幸的是,您还必须提供启动屏幕作为PNG,才能在旧的API中工作。但是,对于具有API 23+的每个设备,将使用vector drawable。

希望我这个答案能对遇到同样问题的人有所帮助!


ℛɑƒ*_*ƒæĿ 8

对于全屏启动,请尝试使用:

android:gravity="fill_horizontal|fill_vertical"
Run Code Online (Sandbox Code Playgroud)

如果不解决,可能解决方案是为每个分辨率大小创建分离的图像.


最常见的决议:

  • 小= 240 x 320px(ldpi)
  • 中= 320 x 480px(mdpi)
  • 大= 480 x 800px(hdpi)
  • xLarge = 640 x 960px(xhdpi)

肖像格式:

  • ldpi = 240 x 360px(0.75 x mdpi)
  • mdpi = 320 x 480px(基本密度)
  • 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 320px(基本密度)
  • 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)

有关您的更多信息,请访问:

  1. https://design.google.com/devices/

  2. Android启动屏幕图像大小适合所有设备

  3. http://vinsol.com/blog/2014/11/20/tips-for-designers-from-a-developer/


que*_*gre 5

编辑后的解决方案将使您的 SplashScreen 在所有 API(包括 API21 到 API23)上看起来都很棒

首先阅读这篇文章并遵循制作闪屏的好方法。

如果您的徽标扭曲或不适合,并且您仅针对 API24+,您可以直接在其 xml 文件中缩小矢量绘图,如下所示:

<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
android:viewportWidth="640"
android:viewportHeight="640"
android:width="240dp"
android:height="240dp">
<path
    android:pathData="M320.96 55.9L477.14 345L161.67 345L320.96 55.9Z"
    android:strokeColor="#292929"
    android:strokeWidth="24" />
</vector>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我将在 640x640 画布上绘制的可绘制对象重新缩放为 240x240。然后我就把它放在我的闪屏可绘制中,就像这样,效果很好:

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

<!-- The background color, preferably the same as your normal theme -->
<item>
    <shape>
        <size android:height="120dp" android:width="120dp"/>
        <solid android:color="@android:color/white"/>
    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:drawable="@drawable/logo_vect"
    android:gravity="center">

</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

我的代码实际上只是在底部的图片中绘制三角形,但在这里您可以看到用它可以实现什么。与我使用位图时得到的像素化边缘相比,分辨率最终很棒。因此,请务必使用矢量绘图(有一个名为 vectr 的网站,我用它来创建我的网站,而无需下载专门的软件)。

编辑以使其在 API21-22-23 上也能工作

虽然上面的解决方案适用于运行 API24+ 的设备,但在将我的应用程序安装到运行 API22 的设备上后,我感到非常失望。我注意到闪屏再次试图填满整个视图,看起来就像屎一样。扯了半天的眉毛,终于凭借意志力硬生生解决了。

您需要创建第二个文件,其名称与启动屏幕 xml 完全相同(假设为 flash_screen.xml),并将其放入将在 res/ 文件夹中创建的 2 个名为drawable-v22 和drawable-v21 的文件夹中(为了看到它们,您可以在必须将项目视图从 Android 更改为 Project)。每当相关设备运行与可绘制文件夹中的 -vXX 后缀相对应的 API 时,这都会告诉您的手机重定向到放置在这些文件夹中的文件,请参阅此链接。将以下代码放入您在这些文件夹中创建的splash_screen.xml 文件的图层列表中:

<item>
<shape>
    <size android:height="120dp" android:width="120dp"/>
    <solid android:color="@android:color/white"/>
</shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item android:gravity="center">
    <bitmap android:gravity="center"
        android:src="logo_vect"/>

</item>
Run Code Online (Sandbox Code Playgroud)

这是文件夹的样子

由于某些 API 的原因,您必须将可绘制对象包装在位图中才能使其正常工作并让最终结果看起来相同。问题是您必须使用带有其他可绘制文件夹的方法,因为第二个版本的splash_screen.xml 文件将导致您的启动屏幕在运行 API 高于 23 的设备上根本不显示。您可能还必须放置将splash_screen.xml的第一个版本放入drawable-v24中,因为android默认为它可以找到的最近的drawable-vXX文件夹来获取资源。

我的启动画面