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

dro*_*idy 40 android

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

Ste*_*ley 68

这里有三个不同但相互联系的概念:屏幕密度(每英寸/厘米像素,或通常称为打印机每英寸点数的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,它将保持原样,并且它看起来会更小.

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

  • @Praveen Chandrasekaran:据我所知,你无法区分依赖hdpi文件夹的两个,但这是正常的.两个屏幕可能具有相同的密度.但是,您可以通过编程方式获取屏幕大小.请参阅Display Metrics类(http://developer.android.com/reference/android/util/DisplayMetrics.html)这是一种更可靠的方法 - 屏幕的密度与其像素数无关.例如,屏幕不能具有高密度且仅具有480x320像素的绝对原因. (2认同)

rnd*_*Str 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   
Run Code Online (Sandbox Code Playgroud)

将您的应用限制为特定的屏幕尺寸(通过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>
Run Code Online (Sandbox Code Playgroud)

对于代码级别的tweeking:

float scale = getContext().getResources().getDisplayMetrics().density;
别忘了:

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

这一切都在这个doc:developer.android.com : Supporting Multiple Screens