android多分辨率开发的解决方案

参考资料: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的新手,若有遗漏或者错误之处,望大神们指正指正。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值