关于密度,我很困惑.我看到中密度,屏幕分辨率可以是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,它将保持原样,并且它看起来会更小.
那里!一个很长的答案给你.我希望这是有道理的.
为了完整性,还要检查这些选项以控制布局:
目录限定符:
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
| 归档时间: |
|
| 查看次数: |
33365 次 |
| 最近记录: |