Android多种屏幕尺寸,密度相同

时间:2010-04-14 14:30:48

标签: android

我对密度感到困惑。我看到中密度,屏幕分辨率可以是320x480,480x800或480x854。因此,如果我在mdpi文件夹中有300px宽的图像,那么在所有3种不同的屏幕尺寸(主要是320x480与其他2)相比,它的外观大小如何? 通过看起来相同的尺寸,我的意思是根据屏幕尺寸的比例变大或变小。感谢。

6 个答案:

答案 0 :(得分:67)

这里有三个不同但相互联系的概念:屏幕密度(每英寸/厘米像素,或通常称为打印机每英寸点数的DPI),物理屏幕尺寸(以英寸或厘米为单位)和像素数(也称为分辨率,以像素为单位。)

这些术语可互换,您需要了解它们如何相互关联,以免与问题混淆。通常,您可以忽略物理屏幕大小,因为已经考虑了密度。例如,3英寸宽和300像素横跨的屏幕将具有100的DPI。此外,即使像素的数量非常不同,电话屏幕也倾向于具有大致相同的物理尺寸。

所以,让我们考虑G1或Hero的屏幕,其分辨率为480x320,密度约为160dpi。 300像素宽的图像将是1.875英寸宽。这是通过像素大小(300)/密度(160)计算的。现在,如果将其与Nexus One,Droid或类似设备的屏幕进行比较,这些型号的屏幕分辨率更高,约为800x480,高密度约为240dpi。如果您显示相同的300px宽图像,它现在仅在物理上以大约1.5英寸的宽度显示。换句话说,它会小得多。这可能是一个问题,因为如果图像包含文本,那么文本可能不再可读。

Android可以被告知自动缩放图像以适应这些不同的屏幕,因此它看起来仍然是相同的大小。这可以通过在“密度无关”像素中设置大小来完成。如果宽度为100dp,则在中密度屏幕上宽度为100px。在高密度屏幕上,它将是150px宽,但它们在实际屏幕上看起来大小相同。但是,如果这样做,您的图像可能会有点模糊。这与在照片查看程序中过于紧密地放大照片时的情况相同;边缘变得模糊,因为它在你缩放时“拉伸”它们。

解决此问题的方法是使用mdpi,hdpi等文件夹。你给Android一个已经缩放的图像,这样它就不必自己动手了。显然,如果你只是在Photoshop中自己拉伸图像,那么它看起来就不会更好了。但通常人们会调整非常大的图像,使其适合移动屏幕。在这种情况下,您只需将它们调整三次,每次都分成不同的分辨率。

所以最后要回答你的具体问题:如果你的mdpi文件夹中有一个图像,无论屏幕分辨率如何,它都将完全相同,只要它们的密度都相同。将改变的是它们周围的空间,例如一个320x320px宽的图像将填充320x480屏幕的大部分,但只占480x800屏幕的三分之一。然而,如上所述,通常较高分辨率的电话也具有更密集的屏幕。在这种情况下,Android不会在您的mdpi文件夹中查找图像 - 它将转到hdpi文件夹,如果在那里找不到它,它将采用默认的“drawable”文件夹。然后,如果您使用过DP,它会自动缩放它,或者如果您使用过PX,它会保持原样,并且看起来会更小。

有!一个很长的答案给你。我希望这是有道理的。

答案 1 :(得分:8)

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

目录限定符:

Size:         small, normal, large
Density:      ldpi, mdpi, hdpi, nodpi(no auto-scale)
Aspect ratio: long, notlong
Orientation:  land
用法:

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>

对于代码级别的tweeking:

float scale = getContext().getResources().getDisplayMetrics().density;
不要忘记:

dpi    = 160; //At 160dpi
pixels = dips * (density / dpi)

这一切都在这个文档中: developer.android.com:Supporting Multiple Screens

答案 2 :(得分:4)

  

所以,如果我有300px宽的图像   在mdpi文件夹中,它是怎么回事   所有3种不同的外观尺寸相同   屏幕尺寸(主要是320x480 vs   其他2)?

图像的物理外观是由屏幕密度驱动的,而不是屏幕尺寸。您的-mdpi文件夹与屏幕大小无关 - 它与屏幕密度相关联。

答案 3 :(得分:2)

请您确认计算屏幕密度的公式吗?

正如我所读到的,以下是公式:

密度= SQRT(wp ^ 2 + hp ^ 2)/屏幕尺寸

wp - &gt;屏幕宽度(以px为单位) hp - &gt;屏幕高度(以px为单位) 屏幕尺寸 - &gt;物理屏幕尺寸(对角线英寸)

屏幕尺寸(320x480)= SQRT(102400 + 230400)/ 160 = 3.6英寸

屏幕尺寸(480x800)= SQRT(640000 + 230400)/ 160 = 5.8英寸

屏幕尺寸(480x854)= SQRT(729316 + 230400)/ 160 = 6.12英寸

因此,布局(UI屏幕)由屏幕尺寸驱动(小:<3“,正常<4”, 大的&gt; 5“)和可绘制的资源(图像)由屏幕密度驱动。

并且,如果屏幕的密度,图像的大小(以像素为单位)不会改变 (320x480,480x800或480x854)是相同的。

请你确认一下吗?

谢谢, 拉姆

答案 4 :(得分:1)

这就是设备无关像素(DIP)的用途。而不是320px320dip

http://developer.android.com/guide/practices/screens_support.html

答案 5 :(得分: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);