Android具有相同密度的多种屏幕尺寸

我对密度感到困惑。 我看到中等密度的屏幕分辨率可能是320×480,480×800或480×854。 所以,如果我在mdpi文件夹中有300像素宽的图像,在3种不同的屏幕尺寸(主要是320×480 vs其他2种)上看起来大小如何? 而看起来相同的尺寸,我的意思是规模是更大或更小取决于屏幕的大小。 谢谢。

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

这些术语是不可互换的,你需要了解它们是如何相互联系的,而不是混淆这个问题。 一般来说,您可以忽略物理屏幕的大小,因为这已经在密度中占了。 例如,3英寸宽和300像素的屏幕将具有100的DPI。此外,即使像素的数量非常不同,手机屏幕倾向于具有大致相同的物理尺寸。

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

Android可以被告知自动缩放图像,以适应这些不同的屏幕,使它看起来仍然是相同的大小。 这是通过设置密度独立像素中的大小来完成的。 如果宽度为100dp,则在中等密度的屏幕上宽度为100px。 在高密度的屏幕上,它将是150px宽,但他们都将在实际屏幕上看起来大小相同。 但是,如果你这样做,你的形象可能会有点模糊。 这与您在图片浏览程序中放大照片太紧密相同, 边缘变得模糊,因为它在放大的同时“伸展”它们。

解决这个问题的方法是使用mdpi,hdpi等文件夹。 你给Android的图像已经被缩放了,所以它不必自己做。 显然,如果你只是在Photoshop中自己展开图片,那么它看起来不会更好。 但通常情况下,人们将调整非常大的图像,使其适合手机屏幕。 在这种情况下,您只需将它们重新调整为三个不同的时间,每个时间分辨率不同。

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

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

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

目录限定符:

大小:小,正常,大
密度: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> 

而对于代码级别的tweeking:


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

别忘了:

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

这一切都在这个文档中: developer.android.com : SupportingMultipleScreens

所以,如果我在mdpi文件夹中有300像素宽的图像,在3种不同的屏幕尺寸(主要是320×480 vs其他2种)上看起来大小如何?

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

你能确认计算屏幕密度的公式吗?

据我所知,以下是公式:

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

wp – >屏幕宽度(以px为单位)hp – >屏幕高度(以px为单位)屏幕大小 – >物理屏幕大小(对angular线英寸)

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

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

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

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

而且,如果屏幕的密度(320×480,480×800或480×854)相同,则图像的大小(以像素为单位)不会改变。

能否请你确认?

谢谢,Ram

这是设备独立像素(DIP)的用途。 而不是320px320dip

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

实际上,计算设备物理屏幕大小的代码如下:

 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);