参考资料:http://blog.sina.com.cn/s/blog_7ce2cb410100yl0y.html
http://www.eoeandroid.com/thread-193122-1-1.html
注:由于安卓手机越来越多样,碎片化也越来越严重,所以本文叙述的方法已经不完全适用当今的安卓手机市场,不过文章中前面的基础知识还是十分有用。对于新的应对方案可参看下一篇文章android多分辨率开发的解决方案(2)-----适配大部分手机,谢谢。2015-12更
时下的android手机屏幕分辨率各式各样,要想开发一个能适应各种手机的应用确实不容易。现在说说我最近学习的一些解决方案。
首先介绍几个必须理解的概念:
物理尺寸: 就是所说的几寸的屏幕,代表屏幕对角线的长度,比如3.5寸、3.7寸、4寸、7寸等。
分辨率: 屏幕总共能显示的像素数,如240*320,320*480,480*800等
像素密度(dp/dpi): device independent pixels(设备独立像素)
屏幕密度:android官方根据手机的分辨率和物理尺寸来分出几个不同屏幕密度,一般有:ldpi(120)、mdpi(160)、hdpi(240)、xdpi(320):
下面是一些分辨率信息
名称 | 分辨率 | 屏幕密度 |
QVGA | 320*240 | 120 |
WQVGA400 | 400*240 | 120 |
WQVGA432 | 432*240 | 120 |
HVGA | 640*480 | 160 |
WSVGA | 1024*600 | 160 |
WXGA800 | 1280*800 | 160 |
WVGA800 | 800*480 | 240 |
WVGA854 | 854*480 | 240 |
WXGA720 | 1280*720 | 320 |
而根据屏幕的物理尺寸大小,又分出了几个类别
有了以上概念,即可准备为多分辨率进行开发了。
因为在不同分辨率的手机,你用同一个布局文件,同一套图片在显示上必定会出现差异,所以接下来你可以根据不同分辨率的手机加载不同的布局文件以及不同的图片资源。首先谈谈图片资源,在上面的所谈到的屏幕密度,我们可以创建对应的图片资源文件夹(如下),当你加载图片资源时,android底层便会根据对应的文件夹加载资源:
drawable | 默认中等密度 |
drawable-ldpi | 低密度 ~120dpi |
drawable-hdpi | 高密度 ~240dpi |
drawable-mdpi | 中等密度 160dpi |
drawable-xhdpi | 更高密度 ~320dpi |
drawable-nodpi | 所有密度资源,无论什么密度屏幕都会适配。 |
drawable-tvdpi | 介于mdpi~hdpi 约213dpi 主要应用在电视。 |
注意:若在AndroidManifest.xml没有如下代码自适应就不能实现:
</application>
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity = "true"/>
</manifest>
在</application>标签和</manifest>标签之间添加上面那段代码。即可
但是很多情况出现不同手机显示不一是因为布局上的差异,这个时候我们需要为不同的屏幕类型的手机创建不同的布局文件:
根据上面按照物品尺寸分类的屏幕类别,我们可以分出以下类别的布局文件:
layout | 默认中等屏幕 |
layout-small | 小屏幕 |
layout-large | 大屏幕 |
layout-normal | 普通屏幕 |
现在着重解释如何根据不同布局文件实现自适应分辨率:
布局文件中有个单位dp :像素密度(dp/dpi): device independent pixels(设备独立像素),这个单位与像素px能够互换,公式为:
px = dp * (手机屏幕密度 / 160)
dp = px/(手机屏幕密度 / 160)
根据这些公式我们可以计算下不同手机屏幕的满屏的dp值是多少:
小屏幕:
QVGA: dp = 240/(120/160) = 320dp
普通屏幕:
WQVGA: dp = 240/(120/160)= 320dp
FWQVG: dp = 240/(120/160) = 320dp
HVGA : dp = 320/(160/160)= 320dp
WVGA :dp = 480/(240/160)= 320dp
FWVGA : dp = 480/(240/160)= 320dp
大屏幕: WVGA : dp =480/(160/160)= 480dp
FWGA : dp =480/(160/160)= 480dp
以上为各种分辨率手机已dp为单位时,满屏的数值,也就是说对于小屏幕QVGA的手机,若布局的组件的宽度定为320dp,那么这个组件就宽度就占满整个屏幕;
而对于大屏幕VWGA,组件宽度要定为480dp才能占满整个屏幕,其他分辨率类似。
对于这个结论,我还做了以下测试:
1、布局文件只有layout一个文件夹时,即各种分辨率手机共同使用一个布局文件,此时我设一个ImageView组件的宽度为320dp,
在普通屏幕WVGA(480X800)的手机中,显示如下:(图片宽度占满全屏)
而在大屏幕WVGA(480X800)中,显示如下:(图片宽度只占满四分之三)
2、当有不同布局文件夹分类时(layout-normal和layout-large),我在layout-normal的布局文件中为ImageView宽度设为320dp,而在layout-large的文件中设为480dp,
此时两个不同分辨率的设备中,图片的显示都是占满整屏;
以前看过一篇博客说宽度为320dp的控件总能在宽度上占满整个屏幕。查看上面算出来的值,除了大屏幕外,其他手机确实如此,可见此话并非毫无道理。但是
通过以上测试以及解释,此话是错误的,有些手机是480dp甚至是其他数值才能占满屏幕。所以我们可以设置不同的布局文件以达到适应不同手机分辨率。
因为我也是一个android的新手,若有遗漏或者错误之处,望大神们指正指正。