我想在splash上显示一个全屏PNG.只有一个错误,我不知道

推荐答案

Disclaimer

这个答案来自2013年,已经严重过时.截至Android 3.2,现在有6组屏幕密度.这个答案将尽快更新,但没有预计到达时间.目前所有的密度都参考official documentation(尽管关于特定像素大小的信息总是很难找到).

Here's the tl/dr version

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

    • XLarge(Xhdpi):640x960
    • 大型(hdpi):480x800
    • 中等(mdpi):320x480
    • 小(Ldpi):240x320
  • 阅读Android开发人员指南中的9补丁图像 introduction

  • 设计可以安全拉伸且不会影响最终结果的图像

有了这个,Android将为设备的图像密度 Select 合适的文件,然后根据9-patch标准拉伸图像.

end of tl;dr. Full post ahead

我是在回答与设计有关的问题.我不是开发人员,所以我无法提供代码来实现提供的许多解决方案.唉,我的意图是帮助那些像我帮助开发第一款Android应用程序时一样迷失方向的设计师.

适合所有尺寸

有了Android,公司可以开发几乎任何大小的手机和桌子,几乎可以使用他们想要的任何分辨率.正因为如此,闪屏没有"合适的图像大小",因为没有固定的屏幕分辨率.这给想要实现闪屏的人带来了一个问题.

你的用户真的想看到闪屏吗?

(另一方面,可用性方面的人对闪屏有些不满.有人认为,用户已经知道他点击了什么应用程序,没有必要用闪屏为你的形象打上烙印,因为它只会用"广告"中断用户体验.).但是,在初始化(5s+)时需要大量加载的应用程序(包括游戏等)中,应该使用它,这样用户就不会一直怀疑应用程序是否崩溃了)

屏幕密度.4级

因此,考虑到市场上手机的屏幕分辨率如此之多,谷歌推出了一些替代方案和漂亮的解决方案.首先你要知道的是,Android将ALL个屏幕分为4个不同的屏幕密度:

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

你(如果你是设计师)需要知道的是,Android基本上会根据设备的不同,从4幅图像中 Select 要显示的内容.因此,你基本上必须设计4种不同的图像(尽管可以为不同格式开发更多图像,如宽屏、纵向/横向模式等).

记住这一点,请记住这一点:除非你为Android中使用的每一种分辨率设计一个屏幕,否则你的图像将会伸展到适合屏幕大小.除非你的图像基本上是渐变或模糊的,否则你会在拉伸过程中得到一些不想要的失真.因此,您基本上有两个 Select : for each 屏幕大小/密度组合创建一个图像,或者创建四个9补丁图像.

最难的解决方案是为每种分辨率设计不同的闪屏.您可以按照表中this page结尾的分辨率开始(还有更多.例如:960 x 720没有在那里列出).假设您在图像中有一些小细节,例如小文本,您必须 for each 分辨率设计多个屏幕.例如,在中等屏幕上显示的480x800图像可能看起来不错,但在较小的屏幕上(密度/dpi较高),徽标可能会变得太小,或者某些文本可能会变得不可读.

9补丁图像

另一种解决方案是设置为create a 9补丁图像.它基本上是一个围绕图像的1像素透明边框,通过在此边框的顶部和左侧区域绘制黑色像素,您可以定义图像的哪些部分将被允许拉伸.我不会深入讨论9补丁图像如何工作的细节,但简而言之,与顶部和左侧区域的标记对齐的像素是将重复拉伸图像的像素.

一些基本规则

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

所以你可以在logo的两边(上边框)各放一个点,上下各放一个点(左边框),这些标记的行和列将是唯一需要拉伸的像素.

实例

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

9-补丁图像,102x102px

下面是同一张图片的200%zoom :

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

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

以下是应用程序内100x100中的图像:

渲染成100x100

以下是扩展到460x140后的效果:

渲染为460x140

最后一件事要考虑.这些图像在您的显示器屏幕和大多数手机上可能看起来很好,但如果设备具有非常高的图像密度(dpi),则图像看起来会太小.可能仍然清晰可辨,但是在一张1920x1200分辨率的平板电脑上,图像会出现在中间的一个很小的方块上.那么解决方案是什么呢?设计4个不同的9面片emits 器图像,每个图像的密度不同.为确保不会发生收缩,应 for each 密度类别设计最低的通用分辨率.收缩在这里是不可取的,因为9-patch只考虑拉伸,所以在收缩过程中,小文本和其他元素可能会失go 易读性.

以下是每个密度类别的最小、最常见分辨率列表:

  • XLarge(Xhdpi):640x960
  • 大型(hdpi):480x800
  • 中等(mdpi):320x480
  • 小(Ldpi):240x320

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

同样,避免这种拉伸发生的唯一方法是 for each 分辨率设计一个屏幕(或者 for each 分辨率-密度组合设计一个屏幕,如果你想避免图像在高/低密度设备上变得太小/太大),或者告诉图像不要拉伸,让背景 colored颜色 出现在发生拉伸的任何地方(还要记住,由于 colored颜色 配置文件的原因,Android引擎渲染的特定 colored颜色 可能会与Photoshop渲染的相同特定 colored颜色 不同).

我希望这有意义.祝你好运

Android相关问答推荐

Okhttp3请求.Builder的Post函数不会接受FormBody作为参数

在Android Studio Iguana上运行示例代码时,Gradle Build错误

Android意图过滤器不限制应用程序仅处理YouTube链接

处理Room数据库中的嵌套实体

判断文本视图是否为单行

从片段导航回来

Dispatchers中的Kotlin协同程序.Main没有';t块主螺纹

弹出导航堆栈后,Compose 无法访问 Hilt View Model

如何使用react native下载android中/data/data/[应用程序包名称文件夹]/files中的文件

为什么第二个代码可以安全地在 map 中进行网络调用,因为它已被缓存?

如何禁用自动登录 google play games services android unity?

如何避免多次调用 Jetpack Compose 的 onClick 回调

Jetpack Compose:如何绘制异形边框?

如何用jetpack compose实现垂直李克特量表

安卓模拟器打不开

如何让这个三角形指示器在 android jetpack compose 中旋转和移动?

在 Jetpack Compose 中包装内容

如何使用 Jetpack Compose 制作两个圆圈

java.lang.String 类型的值 Forbidden 无法转换为 JSONObject

为什么我不能直接记住 mutableStateOf 可组合函数?