Android初始屏幕图像大小适合所有设备


214

我有一个全屏PNG,要在启动时显示。只有一个错误,我不知道是什么尺寸摆在每一个绘制的文件夹(ldpimdpihdpi,和xhdpi)。我的应用程序应该可以在所有手机和平板电脑上良好运行。我应该创建什么尺寸(以像素为单位),以便初始画面在所有屏幕上都能正常显示?



4
我想创建一个初始屏幕...
arielschon12

1
@verybadalloc可能会更深入,但是我可以向您保证,由于它发布大约太晚了,所以它对OP的问题没有帮助:p
keyer

6
是的,我很确定这对他没有帮助。在试图自己找出答案的同时找到了这个主题,并决定发布另一个答案,以帮助ppl在我之后进行同样的事情。
卢卡斯·塞罗

我已经回答了类似的类型的问题可能是有帮助stackoverflow.com/questions/30494811/...
拉梅什ķ

Answers:


394

免责声明

这个答案来自2013年,已经严重过时了。从Android 3.2开始,现在有6组屏幕密度。我会尽快对此答案进行更新,但没有ETA。有关当前所有密度,请参阅官方文档(尽管始终很难找到有关特定像素尺寸的信息)。

这是tl / dr版本

  • 创建4张图像,每个屏幕密度一张:

    • xlarge(xhdpi):640x960
    • 大(hdpi):480x800
    • 中(mdpi):320x480
    • 小(ldpi):240x320
  • Android开发人员指南》中的9补丁图片介绍

  • 设计图像时可以安全拉伸区域而不会影响最终结果

有了这个,Android将为设备的图像密度选择适当的文件,然后它将根据9-patch标准拉伸图像。

tl; dr的结尾。完整的帖子

我在回答与设计有关的问题。我不是开发人员,所以我将无法提供代码来实现所提供的许多解决方案。las,我的目的是帮助与我开发第一款Android App时一样迷失的设计师。

适合所有尺寸

借助Android,公司可以开发几乎任何大小,所需的几乎任何分辨率的手机和桌子。因此,由于没有固定的屏幕分辨率,因此初始屏幕没有“合适的图像尺寸”。对于想要实现启动屏幕的人来说,这是一个问题。

您的用户是否真的想看到启动屏幕?

(附带说明,易用性人群不建议使用启动屏幕。有人认为用户已经知道他使用了哪个应用程序,因此不需要使用启动屏幕对图像进行品牌化,因为这样只会打断用户体验,但是,应该在初始化时(5s +)需要一些相当大的负载的应用程序(包括游戏等)中使用它,以使用户不会困惑于应用程序是否崩溃了)

屏幕密度 4节课

因此,鉴于市场上手机的屏幕分辨率如此之多,Google实施了一些替代方案和精美的解决方案来提供帮助。您必须知道的第一件事是,Android将所有屏幕分为4种不同的屏幕密度:

  1. 低密度(ldpi〜120dpi)
  2. 中密度(mdpi〜160dpi)
  3. 高密度(hdpi〜240dpi)
  4. 超高密度(xhdpi〜320dpi)(这些dpi值是近似值,因为定制设备的dpi值会有所不同)

您(如果您是设计师)需要了解的是,Android基本上会从4张图像中进行选择,具体取决于设备。因此,您基本上必须设计4个不同的图像(尽管可以针对不同格式(例如宽屏,人像/风景模式等)开发更多图像)。

请牢记这一点:除非您为Android中使用的每个分辨率设计屏幕,否则图像都会拉伸到适合屏幕尺寸的大小。并且除非您的图像基本上是渐变或模糊的,否则在拉伸时会出现一些不希望的失真。因此,您基本上有两个选择:为每个屏幕尺寸/密度组合创建一个图像,或创建四个9色块图像。

最困难的解决方案是为每个分辨率设计不同的启动屏幕。您可以按照表格末尾的分辨率开始操作本页(还有更多。例如:此处未列出960 x 720)。并假设图像中有一些小细节(例如小文本),则每种分辨率都必须设计多个屏幕。例如,在中等屏幕上显示的480x800图像可能看起来不错,但是在较小的屏幕上(具有更高的密度/ dpi),徽标可能会变得太小,或者某些文本可能变得不可读。

9幅图像

另一种解决方案是创建9补丁图像。它基本上是图像周围的1像素透明边框,通过在此边框的顶部和左侧绘制黑色像素,可以定义允许图像的哪些部分拉伸。我不会详细介绍9补丁图像的工作原理,但是,简而言之,与顶部和左侧区域的标记对齐的像素是将被重复拉伸图像的像素。

一些基本规则

  1. 您可以在photoshop(或可以精确创建透明png的任何图像编辑软件)中制作这些图像。
  2. 1像素边框必须为全透明。
  3. 1像素透明边框必须围绕图像,而不仅仅是顶部和左侧。
  4. 您只能在此区域绘制黑色(#000000)像素。
  5. 顶部和左侧边框(定义图像拉伸)只能有一个点(1px x 1px),两个点(均为1px x 1px)或一条连续线(宽度x 1px或1px x高度)。
  6. 如果选择使用2个点,则图像将按比例放大(因此每个点将轮流扩展,直到达到最终的宽度/高度)
  7. 1px边框必须是除了预期的基本文件尺寸之外的。因此,一个100x100的9色块图像实际上必须具有102x102(顶部,底部,左侧和右侧的100x100 +1像素)
  8. 9补丁图像必须以* .9.png结尾

因此,您可以在徽标的任一侧(顶部边框)放置1个点,在徽标的上方和下方(左侧边框)放置1个点,这些标记的行和列将是唯一要拉伸的像素。

这是一个9色块的图片,尺寸为102x102px(最终尺寸为100x100,用于应用目的):

9张图片,102x102px

这是同一张图片的200%缩放:

相同的图像,为清楚起见放大了2倍

请注意顶部和左侧的1px标记,表示将扩展哪些行/列。

这是应用内100x100的图片:

渲染成100x100

这是将其扩展为460x140时的状态:

渲染为460x140

最后要考虑的一件事。这些图像在监视器屏幕和大多数手机上看起来都不错,但是如果设备的图像密度(dpi)非常高,则图像看起来会太小。也许仍然清晰可辨,但是在分辨率为1920x1200的平板电脑上,图像会在中间显得很小。那么解决方案是什么?设计4个不同的9补丁发射器图像,每个图像用于不同的密度集。为确保不会发生收缩,应针对每种密度类别以最低的通用分辨率进行设计。此处缩小是不希望的,因为9补丁仅说明了拉伸,因此在缩小过程中,小文本和其他元素可能会失去可读性。

这是每种密度类别的最小,最常用分辨率的列表:

  • xlarge(xhdpi):640x960
  • 大(hdpi):480x800
  • 中(mdpi):320x480
  • 小(ldpi):240x320

因此,以上述分辨率设计四个启动屏幕,展开图像,在画布周围放置1px透明边框,并标记哪些行/列可拉伸。请记住,这些图像将用于密度类别中的任何设备,因此在具有较小图像密度(〜120 dpi)的超大型平板电脑上,您的ldpi图像(240 x 320)可能会拉伸到1024x600。因此,只要您不希望在启动画面上使用照片或复杂的图形(在设计时请牢记这些限制),9贴片是拉伸的最佳解决方案。

同样,避免这种拉伸的唯一方法是为每个分辨率设计一个屏幕(或者,如果要避免在高/低密度设备上图像变得太小/太大,则为每个分辨率-密度组合设计一个屏幕),或者告诉该图像不会拉伸,并且在发生拉伸的任何地方都会显示背景色(还要记住,由于颜色配置文件,Android引擎渲染的特定颜色看起来可能与photoshop渲染的特定颜色看起来有所不同)。

我希望这有道理。祝好运!


1
您为此付出了生命,非常感谢您的回答。
theGrayFox

7
我在实践中发现的东西。如果使用9色块图像,则它必须小于您将支持的最小屏幕。看来图像会放大,但不会缩小,从而导致剪切……而且似乎需要为fitXY设置。。–
Sean Aitken

感谢您的评论,CleverCoder。您能详细说明理想的尺寸是多少,以避免出现任何问题?我假设宽度和高度小2px足够了吗?
卢卡斯·塞罗

1
您说“ xlarge(xhdpi):640x960”,但是文档说xlarge至少为960dp x 720dp,因此xhdpi密度的xlarge屏幕应为1920px x 1440px。密度和大小是不同的概念。
fikr4n 2015年

1
@LucasCerro:您应该考虑在第一行上对这个原本不错的答案进行编辑,说答案已经过时,并且从Android 3.2开始,根据可用的屏幕宽度现在有6组。
詹斯(Jens)

119

人像模式

MDPI为320x480 dp = 320x480px(1x)

LDPI为0.75 x MDPI = 240x360px

HDPI为1.5 x MDPI = 480x720px

XHDPI是2 x MDPI = 640x960px

XXHDPI是3 x MDPI = 960x1440px

XXXHDPI是4 x MDPI = 1280x1920px

风景模式

MDPI为480x320 dp = 480x320px(1x)

LDPI为0.75 x MDPI = 360x240px

HDPI为1.5 x MDPI = 720x480px

XHDPI是2 x MDPI = 960x640px

XXHDPI是3 x MDPI = 1440x960px

XXXHDPI是4 x MDPI = 1920x1280px

编辑:

如果您在2019年以上阅读此文章,我建议使用Lottie作为启动画面


1
大!一直在寻找这个
Lion789 '16

最有用的解决方案
Farzad YZ

6
这些值似乎不正确。XXHDPI应该是1920x1080。
user2966445 '16

是! 谢谢,这就是我一直在寻找的!太感谢了!
theHellyar '17

平板电脑尺寸如何?
Beeing Jk

29

肖像

LDPI:200x320px

MDPI:320x480px

HDPI:480x800px

XHDPI:720px1280px

景观

LDPI:320x200px

MDPI:480x320px

HDPI:800x480px

XHDPI:1280x720px


2
物理屏幕的大小和分辨率是独立的概念。图像大小(以像素为单位)是两者的乘积。
亨利

1
告诉我XXHDPI,XXXHDPI的大小吗?
hitesh141

该答案中的值似乎与此处提供的信息不成比例:stackoverflow.com/a/19661363/1617737。我认为,虽然答案比较老,但更可能是正确的。
ban-geoengineering


12

使用PNG并不是一个好主意。实际上,就性能而言,这是昂贵的。您可以使用可绘制的XML文件,例如Facebook的background

这将帮助您平滑和加快性能,对于徽标,请使用.9补丁图像。


10
Density buckets

LDPI    120dpi    .75x
MDPI    160dpi    1x
HDPI    240dpi    1.5x
XHDPI   320dpi    2x
XXHDPI  480dpi    3x
XXXHDPI 640dpi    4x

px / dp = dpi / 160 dpi


4

就我而言,我在style.xml中使用了列表drawable。使用可绘制的图层列表,您只需要一个png即可适用于所有屏幕尺寸。

<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@drawable/flash_screen</item>
    <item name="android:windowTranslucentStatus" tools:ignore="NewApi">true</item>
</style>

和可绘制文件夹中的flash_screen.xml。

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

“ background_noizi”是可绘制文件夹中的png文件。我希望这有帮助。


如果您的背景图片太大,则会拉伸
ShadeToD


2

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

如果您仅针对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画布上绘制的可绘制对象缩放为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的设备后,我感到非常失望。我注意到启动画面再次试图填充整个视图,看起来像狗屎一样。经过半天的折磨,我终于通过纯粹的意志力强行提出了解决方案。

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

<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文件将导致您的启动屏幕在运行高于23的API的设备上根本不显示。您可能还必须放置android将splash_screen.xml的第一个版本默认为可找到资源的最近的drawable-vXX文件夹作为android。希望这可以帮助

我的启动画面


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.