mdpi、hdpi、xhdpi文件夹是如何工作的?

29

从上面的 Android 开发者指南中提取:

320dp:一个典型的手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
480dp:类似 Streak 的 tweener 平板电脑(480x800 mdpi)。
600dp:7 英寸平板电脑(600x1024 mdpi)。
720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)

因此我从设计师那里得到了分辨率为 320 像素每英寸的图形(图片),仅在以下尺寸:

480x800 hdpi

720x1280 mdpi

800x1280 mdpi

我不确定应该将哪个大小的图像放入 mdpi 文件夹、hdpi 文件夹和 xhdpi 文件夹。我想制作一个可以在大多数 Android 手机和平板电脑上运行的应用程序?

4个回答

38
您可以创建不同的图形对象以适用于不同的像素密度。Android将mdpi(每英寸160个像素)作为基准密度。因此对于mdpi设备,1dp = 1个像素。在更高的密度下,每英寸有更多的像素(hdpi是240,xhdpi是320)。Android试图使图形图像在屏幕上占据相同的物理尺寸,而不考虑设备像素密度。因此,如果它找到的只是一个mdpi资源,并且设备是hdpi,它将按照240/160 = 150%的比例缩放图形,并将xhdpi的图形大小加倍。
如果您不想要这种自动缩放(可能会使图形看起来很差),您可以为高密度提供自己版本的图形资源。这些图形应该与Android缩放mdpi资源的大小相同。
请注意,存储在图像文件中的像素/英寸与此无关。这全部基于您放置项目资源目录中的图形文件的位置。任何放置在res/drawable中的图形都被认为是适合于mdpi显示器的正确大小,放置在res/drawable-mdpi中的图形也是如此。它在res/drawable-hdpi中发现的图像文件被认为是适合于hdpi显示器的正确大小,等等。当程序在特定设备上运行时,Android首先查找与该设备的显示密度匹配的图形。如果没有找到匹配的图形,则使用不同密度的图形并根据上述规则自动缩放图像。

1
@MuhammadIrfan - 如果图像在每英寸240个像素的显示器上具有正确的大小,则应将其放置在“res/drawable-hdpi”中。您应该知道,设备可以具有不同的尺寸,仍然是hdpi。此外,设备可以具有相同的尺寸并具有不同的像素密度。这个不幸的真相被称为“设备碎片化”,这也是Android编程可能会变得复杂的原因之一。您是否正在尝试将图像完全适合于显示器的大小? - Ted Hopp
1
@MuhammadIrfan - 图像的dpi是无关紧要的。无论Photoshop、Gimp或其他工具存储在图像中的dpi是多少,Android都会忽略它。Android考虑的唯一因素是图像放置在哪个目录中。 - Ted Hopp
1
@MuhammadIrfan - 我认为你在这里最好使用drawable-large等目录。如果您想避免根据显示密度进行缩放,请使用drawable-large-nodpi等目录。如果您这样做,那么Android将选择最符合屏幕大小的图像,然后将其缩放到应用程序可用的实际像素(可能与显示大小不匹配)。阅读提供资源获取更多信息。 - Ted Hopp
@PankajKushwaha - 这完全取决于Android在缩放图像方面的表现。对于某些图像,它处理得非常好;而对于某些图像,它可能会糟糕地处理。它的性能严重依赖于图像的性质;唯一的方法是在不同密度的各种设备上进行测试。如果您对结果满意,则仅提供xhdpi可能是一个不错的策略。但是,您应该知道旧版本的Android不识别xhdpi文件夹;在这些情况下,资源甚至可能无法加载。我没有尝试过这个,所以我不知道。 - Ted Hopp
1
@Ahmed - 你也可以控制这个。你可以在资源目录中添加一个大小限定符(-large-small等),可选地与其他限定符一起使用,如密度。有关详细信息,包括限定符的必需顺序,请参阅文档(特别是提供资源支持多屏幕)。 - Ted Hopp
显示剩余10条评论

11
当您请求提供备选资源时,Android会在运行时根据当前设备配置选择要使用的备选资源。为了演示Android如何选择备选资源,请假设以下drawable目录分别包含相同图像的不同版本:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

假设以下是设备配置:
Locale = en-GB 
Screen orientation = port 
Screen pixel density = hdpi 
Touchscreen type = notouch 
Primary text input method = 12key

通过将设备配置与可用替代资源进行比较,Android 从 drawable-en-port 中选择 drawable。系统根据以下逻辑决定使用哪些资源:

enter image description here

参考文献:Android 如何找到最佳匹配资源

其他参考文献:密度无关性提供替代资源最佳实践

我要说的是,您应该阅读完整的页面支持多屏幕, 我认为没有比它更好的文档了...


3
我对不同屏幕尺寸的碎片化感到困惑,但基本要点如下: 1.您需要在布局下创建各种文件夹来处理图像。 2. 图像将存在于各个文件夹下的可绘制文件夹中。 3. 您应该有一个基本的/布局和/可绘制文件夹来配合非特定文件夹。 4. 从xhdpi开始工作,然后缩小图像!
特定屏幕文件夹的示例: /布局-hdpi /布局-xhdpi /可绘制-hdpi /可绘制-xhdpi
根据我的了解: 480 x 800是hdpi(旧手机例如S2、HTC Desire等) 720 x 1280是xhdpi(新手机例如S3、Galaxy Nexus等)
基本上,根据手机的不同,Android会从必要的文件夹中获取资源,如果没有,则会从主“\layout”或“\drawable”文件夹中获取。例如,在Galaxy Nexus上运行的应用程序将从“\layout-xhdpi”中获取资源(如果该文件夹存在)。

1
根据Android仪表板的数据显示,在过去两周内访问Google Play的设备中,ldpi和mdpi设备占比23.2%。此外,屏幕尺寸和像素密度是独立的变量。例如,有些480 x 800的设备属于mdpi。 - Ted Hopp
1
我本来想谷歌一下,但是实在有点懒得动手。不过还是感谢你,这比我想象中的要多得多。但是一年后,那个数字可能会减半或更少。另外请注意,一些手机正在考虑采用1080p分辨率,我认为这很愚蠢...(我刚把我的应用程序从hdpi转换成xhdpi,结果真是够折腾的)。 - karlstackoverflow

0

可以制作一个应用程序,但需要创建以下文件夹:/res/drawable、/res/drawable-mdpi和/res/drawable-hdpi,并为所有屏幕大小添加内容。


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