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