Android应用如何匹配不同的手机分辨率

从android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小:QVGA (240x320),WQVGA400(240x400),WQVGA432 (240x432),HVGA (320x480),WVGA800 (480x800),WVGA854 (480x854)。
然而,由于分辨率的不同,可能会导致同一布局对应不同分辨率的手机显示出不同的效果,如布局错位、图片虚化等,那么,如何解决这一问题呢? 
一、对于界面布局方面
1、根据物理尺寸的大小准备5套布局layout:
(1)layout(放一些通用布局xml文件)  从android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小:QVGA (240x320),WQVGA400(240x400),WQVGA432 (240x432),HVGA (320x480),WVGA800 (480x800),WVGA854 (480x854)。
然而,由于分辨率的不同,可能会导致同一布局对应不同分辨率的手机显示出不同的效果,如布局错位、图片虚化等,那么,如何解决这一问题呢? 
    一、对于界面布局方面
     1、根据物理尺寸的大小准备5套布局layout:
     (1)layout(放一些通用布局xml文件)
     (2)layout-small(屏幕尺寸小于3英寸左右的布局)
     (3)layout-normal(屏幕尺寸小于4.5英寸左右)
     (4)layout-large(4英寸-7英寸之间)
     (5)layout-xlarge(7-10英寸之间)
     2、根据需求配置不同的布局layout。
       如:240x320,则建立layout-320x240;400x800,则建立layout-800x400。需要注意的是:大的写在前面,例如320,小的写在后面,例如240;还有乘号要写成小写的x,不能写成*。
       另外,如果是通用的布局文件,则放在layout下。
 
     最后需注意:对于界面布局方面的分辨率的匹配需要在AndroidManifest.xml里面添加下面一段,没有这一段自适应就不能实现:
                         </application>
                               <supports-screens
                                    android:largeScreens="true"
                                    android:normalScreens="true"
                                    android:smallScreens="true"
                                    android:xlargeScreens="true"
                                    android:anyDensity="true"/>
                </manifest>
       在</application>标签和</manifest> 标签之间添加上面那段代码即可。注意:由于android版本的不同,有些版本不支持xlargeScreens,可以直接将android:xlargeScreens="true"去掉。
     注释:android:anyDensity=["true" | "false"]
     如果android:anyDensity="true",指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。
     如果android:anyDensity="false",应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240×320像素的手机,如果设置android:anyDensity="false",Android系统会将240 x 320(低密度)转换为 320×480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。
 
    二、图片资源方面
     1、需要根据dpi值准备5套图片资源:
      (1)drawable:主要放置xml配置文件或者对分辨率要求较低的图片
      (2)drawalbe-ldpi:低分辨率的图片,如QVGA (240x320)
      (3)drawable-mdpi:中等分辨率的图片,如HVGA (320x480)
      (4)drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
      (5)drawable-xhdpi:至少960dp x 720dp(一般比较少用)
       Android会有自动匹配机制去选择对应的布局和图片资源,系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
    三、动态实现的界面,样式的设定(values方面)
        不同分辨率,界面的字体大小,字体等需要不同的样式,且需要动态生成的情况下,需要把不同分辨率的配置信息保存到应用中。
      举例:在RES里创建 values-480x320 values-800x400
           并在创建的文件夹中分别创建string.xml
           <dimen name="Text_size">30px</dimen>
           在程序中直接调用R.dimen.Text_size
 
    最后,做一下总结:
    (1)不要使用AbsoluteLayout布局,尽量使用RelativeLayout和LinearLayout;   
    (2)在使用布局的时候尽量使用权重,可以有效减少死数据的使用,降低适配的工作量。
(2)layout-small(屏幕尺寸小于3英寸左右的布局)
(3)layout-normal(屏幕尺寸小于4.5英寸左右)
(4)layout-large(4英寸-7英寸之间)
(5)layout-xlarge(7-10英寸之间)
2、根据需求配置不同的布局layout。
如:240x320,则建立layout-320x240;400x800,则建立layout-800x400。需要注意的是:大的写在前面,例如320,小的写在后面,例如240;还有乘号要写成小写的x,不能写成*。
另外,如果是通用的布局文件,则放在layout下。

最后需注意:对于界面布局方面的分辨率的匹配需要在AndroidManifest.xml里面添加下面一段,没有这一段自适应就不能实现:
</application>
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
</manifest>
在</application>标签和</manifest> 标签之间添加上面那段代码即可。注意:由于android版本的不同,有些版本不支持xlargeScreens,可以直接将android:xlargeScreens="true"去掉。
注释:android:anyDensity=["true" | "false"]
如果android:anyDensity="true",指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。
如果android:anyDensity="false",应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240×320像素的手机,如果设置android:anyDensity="false",Android系统会将240 x 320(低密度)转换为 320×480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。

二、图片资源方面
1、需要根据dpi值准备5套图片资源:
(1)drawable:主要放置xml配置文件或者对分辨率要求较低的图片
(2)drawalbe-ldpi:低分辨率的图片,如QVGA (240x320)
(3)drawable-mdpi:中等分辨率的图片,如HVGA (320x480)
(4)drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(5)drawable-xhdpi:至少960dp x 720dp(一般比较少用)
Android会有自动匹配机制去选择对应的布局和图片资源,系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
三、动态实现的界面,样式的设定(values方面)
不同分辨率,界面的字体大小,字体等需要不同的样式,且需要动态生成的情况下,需要把不同分辨率的配置信息保存到应用中。
举例:在RES里创建 values-480x320 values-800x400
并在创建的文件夹中分别创建string.xml
<dimen name="Text_size">30px</dimen>
在程序中直接调用R.dimen.Text_size

最后,做一下总结:
(1)不要使用AbsoluteLayout布局,尽量使用RelativeLayout和LinearLayout; 
(2)在使用布局的时候尽量使用权重,可以有效减少死数据的使用,降低适配的工作量。

原文来自http://blog.sina.com.cn/s/blog_8a30865f0101j2wd.html


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。