如何让应用适应各种屏幕和density

最近写一个应用,发现在density不同的情况下,有时不能满屏。但我的layout里用的是match_parent。所以开一个帖,总结下如何让你的应用程序能适用所有的屏幕。以下部分资料来源于网络搜索,因有的出处已不可查,感谢原作者。

在阅读以下内容时,建议先看下GOOGLE官方的guide 
http://developer.android.com/guide/practices/screens_support.html



应用只显示了默认320×480的区域,没有占满全屏。如下图:

如何让应用适应各种屏幕和density_第1张图片 

在Layout中都有设置下面2句,把最外层的宽和高设为fill_parent,应该能适应屏幕才对。不知道哪出问题了。
android:layout_width="fill_parent" 
android:layout_height="fill_parent"

运行手机自带的那些应用显示都没有问题,新建立一个新的HelloWorld也都显示正常,如下图。

 

就是打开以前的例子和自带的例子有问题。应该还是应用本身哪的设置问题。

在SDK中查到这样一段描述。

<supports-screens android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"] />
       

  Low Density Medium Density High Density
Small Screen QVGA n/a VGA
Normal Screen WQVGA HVGA WVGA, FWVGA
Large Screen n/a VGA, WVGA, FWVGA n/a
       
supports-screens是加在AndroidManifest.xml文件中的,用来标识屏幕的类型。如果是WVGA,应该在该文件中添加下面语句:
<supports-screens android:largeScreens="true"/>

再次编译运行,果然显示正常了。

如何让应用适应各种屏幕和density_第2张图片

按照SDK描述,设置anyDensity应该更好,这个参数能让应用适应各种屏幕。

但是在API Demo中添加 <supports-screens android:anyDensity="true"/> 以后又和之前一样,屏幕只占一部分。

查看刚才的SDK文档,后面对描述如下:
android:anyDensityIndicates whether the application can accommodate any screen     density.  Older applications (pre API Level 4) are assumed unable to     accomodate all densities and this is "false" by default. Applications using      API Level 4 or higher are assumed able to and this is "true" by default.      You can explicitly supply your abilities here.  
这个参数在API Level 4也就是SDK 1.6以后才启用的,而且1.6版本建的API  Level 4的应用默认值就是True,这也就是我刚才自己新建的HelloWorld没做任何处理就能显示正常的原因。

这个API Demo虽然是和1.6 SDK的包里面的,可能并不是在1.6的环境中新建的,所以版本号还是老的。

现在就得查看一下API Level的信息在哪。在每个新建的应用中会有下面2个地方描述Api Level,以Level 4为例:

一个是在AndroidManifest.xml文件的最后,
<uses-sdk android:minSdkVersion="4"></uses-sdk>
该语句标识此例子允许的最低的API Level版本;

另一个地方在default.properties文件中,有如下语句:
target=android-4

看了一下API Demo工程,虽然API Demodefault.properties文件中target=android-4,但是AndroidManifest.xml文件中居然找不到最低Level的描述,可能是因为这个是早期就开发出来的例子,延续下来了。

把<uses-sdk android:minSdkVersion="4"></uses-sdk> 添加进去,并去掉之前添加的supports-screens属性,果然显示正常了。

看来这2个地方设置不正确,即使把anyDensity设为True,也不能让应用自适应屏幕规格。

现在总结一下:

1、创建不同分辨率的AVG设备
手机屏幕可以分为不同的尺寸,比如2寸、2.4寸、2.8寸,而且有不同的分辨率,例如QVGA(240×320),HVGA(320×480)。同一分辨率也可以有不同的尺寸。例如我们手机目前最常用的QVGA(240*320)大的有2.8寸甚至3寸屏屏的,小的才2寸频、2.2寸屏,虽然大小不同,但都是240×320。只是点阵的密度不同而已,大频的密度小,点的颗粒大; 小屏密度大,更加细腻。

如果按默认参数创建一个WVGA的屏幕,相当于从2寸屏的QVGA换成3寸屏的QVGA,只是显示的文字放大了而已。

只有通过修改hardware.ini文件中的hw.lcd.density参数控制屏幕的点阵密度,才能真正调整手机的分辨率,让手机屏幕显示更多的内容。理论上说,通过修改此参数可以得到各种不同点阵密度的屏幕。我试验改成120,果然显示图标显示更小了,能显示更多的内容。

本例里要想让WVGA屏幕真正体现800×480的分辨率,需要把此设备的density改成160。

2、让应用适应屏幕大小
在SDK1.6也就是API Level 4中无须任何处理,默认参数anyDensity=True可以自动帮我们处理了。

但是早期的版本需要分别通过largeScreens、smallScreens、normalScreens来设置屏幕规格才行。不过创建不同屏幕时如果保持默认的density不修改,相当于是在HVGA基础上进行缩放,也可以不设置此参数。



这里还有一个类似的
http://www.eoeandroid.com/thread-41663-1-1.html


你可能感兴趣的:(android,api,Google,layout,application,手机)