关闭

Android屏幕适配之使用布局别名

标签: android开发屏幕适配布局别名
2501人阅读 评论(1) 收藏 举报
分类:

转载请注明出处:http://blog.csdn.net/footballclub/

前言

我们在平时的Android开发中总是会遇到屏幕适配的问题,接下来我会介绍下出现的问题以及为什么要使用布局别名。

基本概念和知识点

分辨率:整个屏幕的像素点的个数,常见的有1280*720,1920*1080

屏幕密度:表示单位面积内的像素个数,通常用dpi为单位,即每英寸多少个像素点

px:像素单位,屏幕上像素点的大小不是固定的,像素点可大可小

dp:长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是: 1px = (目标屏幕密度/标准密度)*dp,标准密度为160dpi,例如,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi的平台则表示1.5个像素的长度

屏幕尺寸:屏幕的大小,通常用屏幕对角线的长度表示,屏幕的大小和屏幕的分辨率没有必然关系,也就是说大屏幕的手机的分辨率不一定比小屏幕手机的分辨率大。

问题背景

下表介绍了屏幕密度和分辨率的关系对照表

名称 屏幕密度 通常分辨率
mhdpi ~160dpi 320*480
hdpi ~240dpi 480*800
xhdpi ~320dpi 720*1280
xxhdpi ~480dpi 1080*1920
xxxhdpi ~640dpi 1440*2560

       通常屏幕密度和分辨率的关系都是这样,但也有一些奇葩的机型不是按照这个标准来的,这个时候就需要我们单独做适配了。譬如说分辨率同样是1280*720的手机,按道理来说,他们的屏幕密度应该是320dpi,但两者的屏幕密度却分别是320dpi和240dpi,很明显240dpi的手机是个奇葩,那么问题就出现了:
       屏幕密度是240dpi的手机,他的宽度有720/(240/160)=480dp,而正常的,320dpi的手机的宽度则只有360dp。那么同样160dp的宽度在两者屏幕上面所占的比例分别是1/3和1/2,这样就导致了160dp在240dpi的手机上看起来会小很多,接下来会介绍怎么简单的来解决这个问题。

最小宽度限定符

        android3.2以后,可以通过使用最小宽度限定符来为不同屏幕提供精确的布局。使用方式:swdp,如layout-sw600dp, values-sw600dp。这里的sw代表smallwidth的意思,当你所有屏幕的最小宽度都大于600dp时,屏幕就会自动到带sw600dp后缀的资源文件里去寻找相关资源文件,这里的最小宽度是指屏幕宽高的较小值,每个屏幕都是固定的,不会随着屏幕横向纵向改变而改变。

       因此我们可以写个values-sw480dp的文件,然后在文件里设置要使用的值240dp,这样一来240dpi的手机使用的dp值就为240了,效果也就和320dpi上面差不多了。

       但是这里有个问题,就是上面说的最小宽度限定符只在android3.2以后才被引入,所以要做3.2之前的设配这样做还是不够的。

  • xlarge screens are at least 960dp x 720dp
  • large screens are at least 640dp x 480dp
  • normal screens are at least 470dp x 320dp
  • small screens are at least 426dp x 320dp

       所以添加values-large.xml也能解决问题。有的人可能说了,既然values-large.xml这样能解决问题,那么为什么还要使用最小宽度限定符呢?嗯… 是这样的:

       在版本低于 3.2 的 Android 设备上,开发人员遇到的问题之一是“较大”屏幕的尺寸范围,该问题会影响戴尔 Streak、早期的 Galaxy Tab 以及大部分 7 英寸平板电脑。即使这些设备的屏幕属于“较大”的尺寸,但很多应用可能会针对此类别中的各种设备(例如 5 英寸和 7 英寸的设备)显示不同的布局。这就是 Android 3.2 版在引入其他限定符的同时引入“最小宽度”限定符的原因。

       所以我们应该保留这两种方式,但是这样的话,就会出现重复,而且当不是240dp的时候,还得分别打开两个文件来修改,非常麻烦,所以这个时候就可以使用布局别名来解决这个问题。

布局别名

首先在values/dimens.xml中有个值width,为160dp

<dimen name="width">160dp</dimen>
<dimen name="width_sw480">240dp</dimen>

       我们需要在240dpi的手机上把值设为240dp,使用布局别名的方式来实现。分别新建values/large/dimens.xml和values/sw480dp/dimens.xml,其中的文件内容都一样

<item name="width" type="dimen">@dimen/width_sw480</item>

       这里的意思就是为width提供别名width_sw480,这样在240dpi的手机上就会使用width_sw480所指定的值了,以后修改也只需改动一处,非常方便。

       当然布局别名也不仅限于dimens,也可用于layout,strings等文件,使用何种类型的布局别名是通过指定type来实现的,type有以下类型:
type的类型

相关参考资料:

  1. http://developer.android.com/guide/practices/screens_support.html
  2. http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources
  3. http://blog.csdn.net/zhaokaiqiang1992/article/details/45419023
2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137813次
    • 积分:1861
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:19篇
    • 译文:0篇
    • 评论:322条
    文章分类
    最新评论