关于 Android 图像和资源尺寸

88
我需要澄清一些关于我的应用程序中图像资产的疑惑,如果我在XML文件中指定某物[图像视图]的高度为50 dip高度,则应从资源文件夹中选择哪种类型的屏幕?
答案:我需要澄清一些关于我的应用程序中图像资产的疑惑,如果我在XML文件中指定某物[图像视图]的高度为50 dip高度,则应从资源文件夹中选择哪种类型的屏幕?
drawable, hdpi, ldpi, mdpi, xhdpi,

要拥有50像素高度的图像,

并且相对于基础图像而言,更大或更小尺寸的图像的百分比是多少,

就像在 iOS 中,@2x 字面上是图像大小的2倍,并且您可以通过编程设置正常大小,

谢谢!


1
你的问题在Android手册中有解释:http://developer.android.com/guide/practices/screens_support.html - Marcin Orlowski
4个回答

376

mdpi是参考密度,即在mdpi显示屏上的1像素等于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分辨率,你应该从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

32
这是我在网上看到的最简单易懂的关于这个话题的解释。我甚至将它加入了我的设计师工作站书签中,哈哈。 - James andresakis
10
哈哈,太棒了! :P 我刚刚也添加了XXHDPI的信息。 - Kevin Coppock
你如何决定从48dip开始?假设你手头只有一个平板电脑(mdpi),你会从随机大小开始,然后迭代直到看起来“足够大”吗? - phtrivier
最好的解释。我也使用这个网站来转换px和dp。https://pixplicity.com/dp-px-converter/ - Azlan Jamal
1
我还制作了一个实时计算的工具:https://pixit-tool.web.app/#/ - widavies
显示剩余3条评论

23

基于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/

完成啦!希望对某些人有所帮助!

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


4

kcoppock做了很好的工作,解释了安卓屏幕密度。我只想再补充一点关于原问题的内容。

安卓平板电脑启动器图标使用更高的密度桶。

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

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

找到来源在这里


1
以下是我对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)
当有多张图片时,我的简短文章对使用imagemagick创建图像资源非常有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接