我有一个全屏PNG,要在启动时显示。只有一个错误,我不知道是什么尺寸摆在每一个绘制的文件夹(ldpi
,mdpi
,hdpi
,和xhdpi
)。我的应用程序应该可以在所有手机和平板电脑上良好运行。我应该创建什么尺寸(以像素为单位),以便初始画面在所有屏幕上都能正常显示?
我有一个全屏PNG,要在启动时显示。只有一个错误,我不知道是什么尺寸摆在每一个绘制的文件夹(ldpi
,mdpi
,hdpi
,和xhdpi
)。我的应用程序应该可以在所有手机和平板电脑上良好运行。我应该创建什么尺寸(以像素为单位),以便初始画面在所有屏幕上都能正常显示?
Answers:
这个答案来自2013年,已经严重过时了。从Android 3.2开始,现在有6组屏幕密度。我会尽快对此答案进行更新,但没有ETA。有关当前所有密度,请参阅官方文档(尽管始终很难找到有关特定像素尺寸的信息)。
创建4张图像,每个屏幕密度一张:
读 Android开发人员指南》中的9补丁图片介绍
有了这个,Android将为设备的图像密度选择适当的文件,然后它将根据9-patch标准拉伸图像。
我在回答与设计有关的问题。我不是开发人员,所以我将无法提供代码来实现所提供的许多解决方案。las,我的目的是帮助与我开发第一款Android App时一样迷失的设计师。
借助Android,公司可以开发几乎任何大小,所需的几乎任何分辨率的手机和桌子。因此,由于没有固定的屏幕分辨率,因此初始屏幕没有“合适的图像尺寸”。对于想要实现启动屏幕的人来说,这是一个问题。
(附带说明,易用性人群不建议使用启动屏幕。有人认为用户已经知道他使用了哪个应用程序,因此不需要使用启动屏幕对图像进行品牌化,因为这样只会打断用户体验,但是,应该在初始化时(5s +)需要一些相当大的负载的应用程序(包括游戏等)中使用它,以使用户不会困惑于应用程序是否崩溃了)
因此,鉴于市场上手机的屏幕分辨率如此之多,Google实施了一些替代方案和精美的解决方案来提供帮助。您必须知道的第一件事是,Android将所有屏幕分为4种不同的屏幕密度:
您(如果您是设计师)需要了解的是,Android基本上会从4张图像中进行选择,具体取决于设备。因此,您基本上必须设计4个不同的图像(尽管可以针对不同格式(例如宽屏,人像/风景模式等)开发更多图像)。
请牢记这一点:除非您为Android中使用的每个分辨率设计屏幕,否则图像都会拉伸到适合屏幕尺寸的大小。并且除非您的图像基本上是渐变或模糊的,否则在拉伸时会出现一些不希望的失真。因此,您基本上有两个选择:为每个屏幕尺寸/密度组合创建一个图像,或创建四个9色块图像。
最困难的解决方案是为每个分辨率设计不同的启动屏幕。您可以按照表格末尾的分辨率开始操作本页(还有更多。例如:此处未列出960 x 720)。并假设图像中有一些小细节(例如小文本),则每种分辨率都必须设计多个屏幕。例如,在中等屏幕上显示的480x800图像可能看起来不错,但是在较小的屏幕上(具有更高的密度/ dpi),徽标可能会变得太小,或者某些文本可能变得不可读。
另一种解决方案是创建9补丁图像。它基本上是图像周围的1像素透明边框,通过在此边框的顶部和左侧绘制黑色像素,可以定义允许图像的哪些部分拉伸。我不会详细介绍9补丁图像的工作原理,但是,简而言之,与顶部和左侧区域的标记对齐的像素是将被重复拉伸图像的像素。
因此,您可以在徽标的任一侧(顶部边框)放置1个点,在徽标的上方和下方(左侧边框)放置1个点,这些标记的行和列将是唯一要拉伸的像素。
这是一个9色块的图片,尺寸为102x102px(最终尺寸为100x100,用于应用目的):
这是同一张图片的200%缩放:
请注意顶部和左侧的1px标记,表示将扩展哪些行/列。
这是应用内100x100的图片:
这是将其扩展为460x140时的状态:
最后要考虑的一件事。这些图像在监视器屏幕和大多数手机上看起来都不错,但是如果设备的图像密度(dpi)非常高,则图像看起来会太小。也许仍然清晰可辨,但是在分辨率为1920x1200的平板电脑上,图像会在中间显得很小。那么解决方案是什么?设计4个不同的9补丁发射器图像,每个图像用于不同的密度集。为确保不会发生收缩,应针对每种密度类别以最低的通用分辨率进行设计。此处缩小是不希望的,因为9补丁仅说明了拉伸,因此在缩小过程中,小文本和其他元素可能会失去可读性。
这是每种密度类别的最小,最常用分辨率的列表:
因此,以上述分辨率设计四个启动屏幕,展开图像,在画布周围放置1px透明边框,并标记哪些行/列可拉伸。请记住,这些图像将用于密度类别中的任何设备,因此在具有较小图像密度(〜120 dpi)的超大型平板电脑上,您的ldpi图像(240 x 320)可能会拉伸到1024x600。因此,只要您不希望在启动画面上使用照片或复杂的图形(在设计时请牢记这些限制),9贴片是拉伸的最佳解决方案。
同样,避免这种拉伸的唯一方法是为每个分辨率设计一个屏幕(或者,如果要避免在高/低密度设备上图像变得太小/太大,则为每个分辨率-密度组合设计一个屏幕),或者告诉该图像不会拉伸,并且在发生拉伸的任何地方都会显示背景色(还要记住,由于颜色配置文件,Android引擎渲染的特定颜色看起来可能与photoshop渲染的特定颜色看起来有所不同)。
我希望这有道理。祝好运!
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作为启动画面
肖像
LDPI:200x320px
MDPI:320x480px
HDPI:480x800px
XHDPI:720px1280px
景观
LDPI:320x200px
MDPI:480x320px
HDPI:800x480px
XHDPI:1280x720px
我搜索了最好和最简单的答案以制作9幅图像。现在制作9个补丁映像是最简单的任务。
从https://romannurik.github.io/AndroidAssetStudio/index.html,您只需单击一下即可制作所有分辨率的9幅图像-XHDPI,HDPI,MDPI,LDPI。
使用PNG并不是一个好主意。实际上,就性能而言,这是昂贵的。您可以使用可绘制的XML文件,例如Facebook的background。
这将帮助您平滑和加快性能,对于徽标,请使用.9补丁图像。
前段时间我创建了一个具有受支持尺寸的excel文件,
希望这对某人有帮助
老实说,我丢掉了这个主意,但它提到了另一个屏幕功能,即尺寸(不仅是密度)
https://developer.android.com/guide/practices/screens_support.html
如果有一些错误,请通知我
就我而言,我在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文件。我希望这有帮助。
经过编辑的解决方案,可使您的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。希望这可以帮助
基于来自卢卡斯·塞罗(Lucas Cerro)的答案,我使用答案中的基线使用Android文档中的比率来计算尺寸。希望这对其他人有帮助!