我有一个全屏的PNG图片,想要在启动画面上显示。但是我不知道应该在每个drawable文件夹(ldpi
, mdpi
, hdpi
, 和 xhdpi
)里放置什么尺寸的图片。我的应用程序应该在所有手机和平板电脑上都能展示得很好,很漂亮。为了让启动画面在所有屏幕上都显示得漂亮,应该创建哪些尺寸(以像素为单位)的图片呢?
我有一个全屏的PNG图片,想要在启动画面上显示。但是我不知道应该在每个drawable文件夹(ldpi
, mdpi
, hdpi
, 和 xhdpi
)里放置什么尺寸的图片。我的应用程序应该在所有手机和平板电脑上都能展示得很好,很漂亮。为了让启动画面在所有屏幕上都显示得漂亮,应该创建哪些尺寸(以像素为单位)的图片呢?
本回答发布于2013年,内容已过时。从Android 3.2开始,现在有6个屏幕密度组。 我会尽快更新此答案,但无法确定时间。 如果需要了解目前所有密度的信息(尽管特定像素大小的信息永远很难找到),请参阅官方文档。
为每种屏幕密度创建4种图像:
在Android开发者指南中阅读9-patch图像介绍
设计具有可以安全拉伸的区域的图像,而不会影响最终结果
有了这些,Android将为设备的图像密度选择适当的文件,然后根据9-patch标准拉伸图像。
我回答与问题相关的设计方面。 我不是开发人员,因此无法提供实现许多解决方案所需的代码。 然而,我的意图是帮助像我一样迷失的设计师们,在开发他们的第一个Android应用时做出正确选择。
使用Android,公司可以开发几乎任何大小、几乎任何分辨率的手机和平板电脑。 因此,闪屏界面没有固定的屏幕分辨率,也就不存在“正确的图像大小”。这对于想要实现闪屏界面的人来说是个问题。
(顺便说一句,可用性专家们并不赞成使用闪屏界面。 有人认为,用户已经知道自己点击了哪个应用程序,使用闪屏界面来品牌化图片并不必要,因为它只会通过“广告”打断用户体验。 但是,它应该在初始化时需要较长时间加载(5秒以上)的应用程序中使用,包括游戏等,以使用户不会卡住想知道应用程序是否已崩溃)
因此,鉴于市场上不同的手机屏幕分辨率如此之多,Google实施了一些替代方案和巧妙的解决方案,可以提供帮助。 您必须知道的第一件事是,Android将所有屏幕分为4个不同的屏幕密度类别:
如果你是设计师,你需要知道的是Android基本上会从4个图像中选择要显示的图像,具体取决于设备。因此,你基本上需要设计4个不同的图像(尽管可以为不同的格式(如宽屏、纵向/横向模式等)开发更多的图像)。
记住,除非你为Android中使用的每个分辨率都设计一个屏幕,否则你的图像将被拉伸以适应屏幕大小。除非你的图像基本上是渐变或模糊,否则在拉伸时会出现一些不良扭曲效果。因此,你基本上有两个选项:为每个屏幕大小/密度组合创建一个图像,或创建四个9-patch图像。
最困难的解决方案是针对每个分辨率设计不同的启动屏幕。你可以先按照此页面末尾的表格中的分辨率进行设计(还有更多。例如:960 x 720没有列出)。并且假设你在图像中有一些小细节,比如小字体,你必须为每个分辨率设计多个屏幕。例如,在中等屏幕上显示的480x800图像可能看起来还可以,但在更小的屏幕上(具有更高密度/dpi),标志可能会变得太小,或者某些文本可能变得无法阅读。
另一种解决方案是创建9-patch图像。它基本上是一个围绕着你的图像的1像素透明边框,通过在这个边框的顶部和左侧区域画黑色像素,你可以定义哪些部分允许拉伸你的图像。我不会详细介绍9-patch图像的工作原理,但简而言之,与顶部和左侧区域的标记对齐的像素是将被重复以拉伸图像的像素。
所以,在您的标志的任一侧(在上边框上)可以放置1个点,在其上下各放置1个点(在左边框上),这些标记的行和列将是唯一会被拉伸的像素。
这是一个9-patch图像,大小为102x102像素(最终的app尺寸为100x100):
这是相同图像的200%缩放版本:
请注意,顶部和左侧的1px标记指示哪些行/列将被扩展。
这是在app内渲染成100x100的样子:
这是将其扩展到460x140的样子:
MDPI为320x480 dp = 320x480像素 (1x)
LDPI为0.75 x MDPI = 240x360像素
HDPI为1.5 x MDPI = 480x720像素
XHDPI为2 x MDPI = 640x960像素
XXHDPI为3 x MDPI = 960x1440像素
XXXHDPI为4 x MDPI = 1280x1920像素
MDPI为480x320 dp = 480x320像素 (1x)
LDPI为0.75 x MDPI = 360x240像素
HDPI为1.5 x MDPI = 720x480像素
XHDPI为2 x MDPI = 960x640像素
XXHDPI为3 x MDPI = 1440x960像素
XXXHDPI为4 x MDPI = 1920x1280像素
编辑:
如果您在2019年或之后阅读此内容,我建议使用Lottie来制作启动画面。
人像画
LDPI:200x320像素
MDPI:320x480像素
HDPI:480x800像素
XHDPI:720x1280像素
风景画
LDPI:320x200像素
MDPI:480x320像素
HDPI:800x480像素
XHDPI:1280x720像素
我找到了制作9-patch图像最好且最简单的方法。现在制作9-patch图像是最容易的任务。
在https://romannurik.github.io/AndroidAssetStudio/index.html上,您只需点击一次即可为所有分辨率(XHDPI、HDPI、MDPI、LDPI)制作9-patch图像。
使用PNG并不是一个好的想法。实际上,就性能而言,它是昂贵的。您可以使用可绘制的XML文件,例如Facebook的背景。
这将帮助您提高性能的流畅度和速度,并且对于标志,使用.9图像。
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
<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>
<?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>
不久前,我创建了一个支持尺寸的 Excel 文件。
希望这对某些人有所帮助。
说实话,我已经忘记了这个想法,但它涉及另一个屏幕特性,即大小(不仅仅是密度)。
https://developer.android.com/guide/practices/screens_support.html
如果有任何错误,请告知我。
编辑后的解决方案将使您的启动屏在所有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>
<?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设备上,我感到非常失望。我注意到启动画面再次尝试填充整个视图并且看起来很糟糕。在拔掉半天眉毛之后,我最终通过纯意志力 brute-forced 找到了解决方案。
你需要创建一个名为splash_screen.xml的第二个文件,并将其放置在res/文件夹中创建的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文件的第二个版本,否则,对于运行API高于23的设备,您的启动屏幕将不会显示。您还可能需要将splash_screen.xml的第一个版本放入drawable-v24中,因为Android默认使用它可以找到的最接近的drawable-vXX文件夹作为资源。希望这有所帮助。
在这个布局中,我们定义了两个子视图:Master 和 Detail。Master 视图使用固定宽度(在本例中为 240dp),而 Detail 视图则填充整个剩余空间。要在代码中使用 SlidingPaneLayout,您需要获取对两个子视图的引用,然后根据需要调整它们的大小和位置。以下是一个获取 Master 视图引用并将其大小设置为屏幕宽度 1/2 的示例:SlidingPaneLayout slidingPaneLayout = findViewById(R.id.sliding_pane_layout); View masterView = findViewById(R.id.master_pane); DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int screenWidth = displayMetrics.widthPixels; masterView.getLayoutParams().width = screenWidth / 2;
这就是如何创建和配置 SlidingPaneLayout 的基础知识。接下来,我将向您展示如何在真实应用程序中使用它来实现 Master-Detail 流程。使用 SlidingPaneLayout 实现 Master-Detail 流程为了演示如何在 Android 应用程序中使用 SlidingPaneLayout 来实现 Master-Detail 流程,我们将构建一个名为 CheeseDetail 的简单应用程序。这个应用程序显示了一些奶酪名称,并在用户点击某个奶酪时显示有关该奶酪的详细信息。以下是应用程序的主活动的 XML 布局: