关于 Android 图像和资产大小

Posted

技术标签:

【中文标题】关于 Android 图像和资产大小【英文标题】:About Android image and asset sizes 【发布时间】:2012-07-19 20:46:58 【问题描述】:

我需要澄清一些关于我的应用的图片资源的疑问,

如果我在 xml 文件中指定某物的高度 [图像视图] 为 50 倾角

我应该从资源文件夹中选择哪种类型的屏幕?

drawable, hdpi, ldpi, mdpi, xhdpi,

拥有 50 px 高度的图像,

以及与基本图像相比,更大、更小尺寸的图像的百分比是多少,

就像在 ios 中一样,@2x 实际上是图像大小的 2 倍,而您以编程方式说是正常大小,

谢谢!

【问题讨论】:

您的问题在android手册中有解释:developer.android.com/guide/practices/screens_support.html 【参考方案1】:

mdpi 是参考密度——也就是说,mdpi 显示器上的 1 px 等于 1 dip。资产缩放比例为:

ldpi | mdpi | tvdpi | hdpi | xhdpi | xxhdpi | xxxhdpi
0.75 | 1    | 1.33  | 1.5  | 2     | 3      | 4

尽管您真的不需要担心tvdpi,除非您是专门为 Google TV 或原始 Nexus 7 开发的,但即使是 Google 也建议您直接使用 hdpi 资产。

这意味着如果您正在制作 48dip 图像并计划支持高达 xxhdpi resolution,您应该从 144px 图像开始(如果您想要 xxxhdpi 的原生资源,则为 192px)并为密度制作以下图像:

ldpi    | mdpi    | tvdpi    | hdpi    | xhdpi     | xxhdpi    | xxxhdpi
36 x 36 | 48 x 48 | 64 x 64  | 72 x 72 | 96 x 96   | 144 x 144 | 192 x 192

如果您已将它们放在特定密度的文件夹中(例如drawable-xhdpidrawable-hdpi 等),它们应该在任何设备上以大致相同的大小显示。

作为参考,这些像素密度为:

ldpi  | mdpi  | tvdpi  | hdpi  | xhdpi  | xxhdpi  | xxxhdpi
120   | 160   | 213    | 240   | 320    | 480     | 640

【讨论】:

这是我在网上看到的对这个话题最简单的解释。我真的在我的设计师工作站上做了标记,哈哈 哈哈,太好了! :P 刚刚也为 XXHDPI 添加了信息。 你如何决定你必须从 48dip 开始?假设您手头只有一个平板电脑 (mdpi),您是否从随机尺寸开始,然后迭代直到它看起来“足够大”? @phtrivier 这只是我用作示例的尺寸。在这种情况下,它是启动器图标的大小。其他资产所需的大小取决于您的用例。 我还制作了一个即时计算的工具:pixit-tool.web.app/#【参考方案2】:

根据 kcoppock 的回答,我创建了以下 shell 脚本,以自动将所有图像调整为正确的大小,并将它们复制到相应的 Android drawable-* - 文件夹中!

创建一个shell脚本并粘贴以下代码:

createAndroidImages.sh

#!/bin/bash

read -p "Please enter the subfolder of the original images? " folder
read -p "How many DP (width) should the image have? " dp

for i in $(find $folder/. -type f -name "*[A-Z]*"); do mv "$i" "$(echo $i | tr A-Z a-z)"; done

mkdir drawable-ldpi
mkdir drawable-mdpi
mkdir drawable-tvdpi
mkdir drawable-hdpi
mkdir drawable-xhdpi
mkdir drawable-xxhdpi
mkdir drawable-xxxhdpi

cp $folder/* drawable-ldpi/
cp $folder/* drawable-mdpi/
cp $folder/* drawable-tvdpi/
cp $folder/* drawable-hdpi/
cp $folder/* drawable-xhdpi/
cp $folder/* drawable-xxhdpi/
cp $folder/* drawable-xxxhdpi/

sips -Z $(echo $dp*3/4 | bc) drawable-ldpi/*
sips -Z $(echo $dp | bc) drawable-mdpi/*
sips -Z $(echo $dp*4/3 | bc) drawable-tvdpi/*
sips -Z $(echo $dp*3/2 | bc) drawable-hdpi/*
sips -Z $(echo $dp*2 | bc) drawable-xhdpi/*
sips -Z $(echo $dp*3 | bc) drawable-xxhdpi/*
sips -Z $(echo $dp*4 | bc) drawable-xxxhdpi/*

将您的脚本放在一个文件夹中,将您的原始图像放在一个子文件夹中,例如:

/
.. createAndroidImages.sh
.. originalImages/
....a123.png
....b456.png

在终端运行shell脚本:sh createAndroidImages.sh

要将创建的图像直接复制到您的 Android Studio 项目中:

cp -R drawable-* ~/AndroidStudioProjects/ESCRating/app/src/main/res/

你已经完成了!希望这对某人有帮助!

附:请注意,原始图像的像素宽度至少应是所需 dpi 宽度的四倍(例如 4(因子 xxxhdpi)* 30dpi => 120px)以获得最佳效果。

【讨论】:

【参考方案3】:

kcoppock 在解释 Andorid 屏幕密度方面做得很好。 我只想就原始问题再补充一点。

Android 平板电脑启动器图标使用一个密度桶。

根据 Google 开发者 Nick Butcher 在 Google+ 上的帖子

Nexus 10 的华丽屏幕属于 XHDPI 密度桶。在平板电脑上,Launcher 使用上一个密度桶 [0] 中的图标来使它们稍微变大。为确保您的启动器图标(可以说是您的应用最重要的资产)清晰,您需要在 drawable-xxhdpi 或 drawable-480dpi 文件夹中添加一个 144*144px 的图标。

查找来源here

【讨论】:

【参考方案4】:

这是我为 android 放大和缩小图像的计算-

ldpi(120 dpi,低密度屏幕)- 36px x 36px (0.19) (1)

mdpi(160 dpi,中等密度屏幕)- 48px x 48px (0.25) (1.33)

hdpi(240 dpi,高密度屏幕)- 72px x 72px (0.38) (2)

xhdpi(320 dpi,超高密度屏幕)- 96px x 96px (0.5) (2.67)

xxhdpi(480 dpi,超超高密度屏幕)- 144px x 144px (0.75) (4)

xxxhdpi(640 dpi,超超超高密度屏幕)- 192px x 192px (1.0) (5.33)

My short article 有助于在有多个图像时使用 imagemagick 创建图像资源。

【讨论】:

以上是关于关于 Android 图像和资产大小的主要内容,如果未能解决你的问题,请参考以下文章

Android 背景图像大小(以像素为单位)

未指定大小的 Android 裁剪图像

Android Google Maps v2 从资产中的图像加载 OverlayTile

为啥我的图像(本地资产或下载的资产)没有在 iOS 14 上显示,而是在使用 ReactNative 0.62.x 的 Android 上显示?

颤振项目的 Android Studio 中缺少“图像资产”选项

当我尝试创建图像资产时,Android Studio 中不存在文件 Logo.png