某些设备中的启动画面失真

Distorted splash screen in some devices

我在修复 android 上的启动画面失真问题时遇到了问题。我正在使用本机反应。请注意,这只发生在某些设备上,例如,我有一个带有 android 版本 4.2.2 的三星(启动画面未失真),而具有 android 版本 8+ 的三星具有扭曲的启动画面。

下面是附加的变形和未变形的启动画面:

第一张图片是 "NOT DISTORTED" 显示

第二张图片是 "DISTORTED" 显示

这是 link 指南 Splash Screen Guide

使您的图像视图的高度和宽度相等 意味着两者都需要具有相同的大小

使资源适用于所有屏幕尺寸以及您使用的是什么设计?你可以 post 你的 xml 吗?

按照以下步骤操作:

1) 仅使用图标并将背景设置为可绘制的渐变。

2) 白色图标的宽度和高度应该相等。使用图标并放置在 XHDPI 和 XXHDPI 可绘制文件夹中。

布局设计:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/sample">

  <ImageView
    android:layout_width="90dp"
    android:layout_height="90dp"
    android:background="@android:color/white"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="90dp"/>
</RelativeLayout>

可绘制背景 sample.xml:

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
   <gradient
    android:startColor="#00ff00"
    android:endColor="#99ff99"
    android:angle="90"/>
   <corners
    android:radius="0dp"/>
 </shape>

支持多屏的示例输出:

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

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

如果您的徽标变形或不适合并且您只针对 APIs24+,您可以直接在其 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>

在上面的代码中,我将在 640x640 canvas 上绘制的可绘制对象重新缩放为 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>

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

编辑以使其也适用于 API21-22-23

虽然上述解决方案适用于运行 API24+ 的设备,但在将我的应用程序安装到设备 运行 API22 后,我感到非常失望。我注意到启动画面再次试图填满整个视图并且看起来很糟糕。拧了半天眉毛,我终于凭着意志力强行解决了。

您需要创建第二个文件,其名称与启动画面 xml(比方说 splash_screen.xml)完全相同,并将其放入您将创建的名为 drawable-v22 和 drawable-v21 的 2 个文件夹中res/ 文件夹(要查看它们,您必须将项目视图从 Android 更改为项目)。这用于告诉您的 phone 在相关设备运行对应于可绘制文件夹 see this link 中的 -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>

出于某些原因,对于这些 API,您必须将可绘制对象包装在位图中,以使其工作并喷射最终结果看起来相同。问题是您必须将方法与其他可绘制文件夹一起使用,因为 splash_screen.xml 文件的第二个版本将导致您的启动画面根本不会在设备上显示 运行 API s 高于 23。您可能还必须将 splash_screen.xml 的第一个版本放入 drawable-v24,因为 android 默认为它可以找到的最近的 drawable-vXX 文件夹。它终于对我有用