Android同一密度下的多种屏幕尺寸

40

我对像素密度感到困惑。我发现中等密度下,屏幕分辨率可以是320x480、480x800或者480x854。所以,如果我在mdpi文件夹中有一张宽度为300像素的图片,那么在这3种不同的屏幕尺寸上看起来会是相同的大小吗(主要是320x480和另外两个)?而且通过“看起来相同的大小”,我的意思是根据屏幕尺寸缩放成更大或更小。谢谢。


1
访问此链接:http://androidtrainningcenter.blogspot.in/2012/01/plan-design-in-best-way-for-multiple.html - Tofeeq Ahmad
6个回答

68
有三个明显但相互关联的概念需要理解:屏幕密度(每英寸/厘米的像素数,通常用打印机中的dpi表示),物理屏幕尺寸(以英寸或厘米为单位)和像素数(也称为分辨率,以像素为单位)。
这些术语不能互换使用,您需要了解它们之间的相互关系以避免混淆。通常,您可以忽略物理屏幕大小,因为它已经在密度中计算过了。例如,一个3英寸宽,300像素宽的屏幕将具有100dpi的密度。此外,即使像素数量很不同,手机屏幕的物理尺寸也趋于相同。
因此,让我们考虑G1或Hero的屏幕,它具有480x320的分辨率和约160dpi的密度。一个宽度为300像素的图像将为1.875英寸。这是通过像素大小(300)/密度(160)计算得出的。现在,如果您将其与Nexus One、Droid或类似型号的屏幕进行比较,这些型号具有约800x480的更高分辨率屏幕和约240dpi的高密度。如果您显示相同的300像素宽图像,则其物理显示尺寸将仅为约1.25英寸。换句话说,它会小得多。这可能是个问题,因为如果图像包含文本,则文本可能无法再阅读。
Android可以自动调整图像大小以适应这些不同的屏幕,使其仍然看起来具有相同的大小。这是通过设置密度无关像素大小来完成的。如果某物在中等密度屏幕上宽100dp,则在高密度屏幕上它将宽150px,但它们在实际屏幕上看起来大小相同。但是,如果您这样做,您的图像可能会有点模糊。这就像在图片查看程序中过度放大照片时一样;边缘变模糊是因为“拉伸”了它们当您放大时。解决这个问题的方法是使用mdpi、hdpi等文件夹。您提供给Android的是已经缩放过的图像,因此Android不需要再次对其进行缩放。显然,如果您只是在Photoshop中自己拉伸图像,那么它看起来并不会更好。但通常情况下,人们会将非常大的图像缩小以适应移动屏幕。在这种情况下,您只需将其缩小三次,每次缩放到不同的分辨率即可。
因此,最终回答您的具体问题:如果您在mdpi文件夹中放置了一张图像,并且所有屏幕分辨率都相同,则该图像的大小将完全相同。变化的是周围的空间大小,例如,320x320像素宽的图像将填充大多数320x480的屏幕,但只会占据480x800屏幕的三分之一左右。然而,正如上面所述,通常更高分辨率的手机也具有更高的屏幕密度。在这种情况下,Android不会在mdpi文件夹中查找图像-它将进入hdpi文件夹,如果在那里找不到它,它将使用默认的“drawable”文件夹。然后,如果您使用的是DP,则会自动缩放它;如果您使用的是PX,则会保持原样,并且它只会看起来更小。
那么,这就是一个非常长的答案。希望您能理解。

如何区分480X800和480X854屏幕。我们有一个选项可以将一个图像放在hdpi文件夹中。在我的情况下,480X800图像不支持480X854图像。有什么想法吗? - Praveen
2
据我所知,您无法依靠hdpi文件夹区分两者,但这很正常。两个屏幕可能具有相同的密度。但是,您可以通过编程方式获取屏幕大小。请参见Display Metrics类(http://developer.android.com/reference/android/util/DisplayMetrics.html)。这是一种更可靠的方法 - 屏幕的密度与其像素数无关。例如,屏幕为高密度且仅具有480x320像素的绝对原因不存在。 - Steve Haley
一张宽度为300像素的图片将会有1.875英寸宽。这是通过像素大小(300)/密度(160)计算得出的。 - Jack BeNimble
那么我应该在每个文件夹中放入什么大小的内容呢? - Ruchir Baronia
所以,我需要相应地设置边距(或其他属性),以适应具有不同屏幕尺寸的相同密度(在我的情况下是xhdpi)设备。我必须以编程方式检查屏幕尺寸,然后应用边距。我是正确的吗?感谢@SteveHaley有用的评论。 - Maulik Dodia

8

为了完整性,还要检查以下选项来控制布局:

目录限定符:

尺寸:小,正常,大
密度:ldpi,mdpi,hdpi,nodpi(不自动缩放)
纵横比:长,非长
方向:横屏
用法:

res/layout/my_layout.xml            
res/layout-small/my_layout.xml      
res/layout-large/my_layout.xml      
res/layout-large-long/my_layout.xml      
res/layout-large-land/my_layout.xml     
res/drawable-ldpi/my_icon.png  
res/drawable-mdpi/dpi/my_icon.png  
res/drawable-hdpi/my_icon.png      
res/drawable-nodpi/composite.xml   

通过AndroidManifest将您的应用限制在特定的屏幕尺寸上:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
          android:largeScreens="true"
          android:normalScreens="true"
          android:smallScreens="true"
          android:anyDensity="true" />
...
</manifest>

对于代码级别的微调:

float scale = getContext().getResources().getDisplayMetrics().density;

不要忘记:

dpi    = 160; //在160dpi下
pixels = dips * (density / dpi)

所有内容都在这个文档中:

developer.android.com:支持多种屏幕

4
如果我在mdpi文件夹中有一个宽度为300px的图像,那么它在所有3个不同的屏幕尺寸(主要是320x480与其他两个)上看起来会是相同大小吗?
图像的物理外观由屏幕密度驱动,而不是屏幕尺寸。你的-mdpi文件夹与屏幕尺寸无关--它与屏幕密度相关联。

2

2
请确认计算屏幕密度的公式:
按照您所读到的,以下是该公式:
密度= SQRT(wp^2 + hp^2)/屏幕尺寸
wp -> 屏幕宽度(以px为单位) hp -> 屏幕高度(以px为单位) 屏幕尺寸 - > 物理屏幕尺寸(对角线英寸)
屏幕尺寸(320x480)= SQRT(102400 + 230400) /160 = 3.6 英寸
屏幕尺寸(480x800)= SQRT(640000 + 230400) /160 = 5.8 英寸
屏幕尺寸(480x854)= SQRT(729316 + 230400) /160 = 6.12 英寸
因此,布局(UI屏幕)由屏幕尺寸驱动(小:<3",正常:<4",大于5"),可绘制资源(图像)由屏幕密度驱动。
并且,如果屏幕密度(320x480、480x800或480x854)相同,则图像的大小(以像素为单位)不会改变。
请确认一下,谢谢。 Ram

0

实际上,用于计算设备物理屏幕尺寸的代码如下:

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

double x = Math.pow(dm.widthPixels/dm.xdpi,2);

double y = Math.pow(dm.heightPixels/dm.ydpi,2);

double screenInches = Math.sqrt(x+y);

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