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

原创 2015年07月08日 09:12:57

转载请注明出处: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
版权声明:本文为博主原创文章,未经博主允许不得转载。

布局别名

8.4  布局高级技术 本节将介绍一些与布局相关的技巧,通过这些技巧,可以更灵活地使用布局,并且也可以使布局更加有效率,占用更少的资源。 8.4.1  布局别名 布局别名本是...

android 布局别名的应用

大部分使用别名都会用在布局上,现在写一个示例【简单易懂】,视屏不同屏幕的布局文件,是做适配的一种重要方法。 1.新建2个布局、一个是小屏幕的【5寸一下】b.xml,一个是大屏幕的【5寸以上】a.xm...

android-支持多种屏幕[创建别名资源] 十三

如果您想将某一资源用于多种设备配置(但是不想作为默认资源提供),则无需将同一资源放入多个备用资源目录中。 相反,您可以(在某些情况下)创建备用资源,充当保存在默认资源目录下的资源的别名。 注:并...

让AlertDialog在按钮被点击后不消失【android搞死你】

在网上搜索了一下,发现有两种做法: 第一: 使用反射: 在你的setPositiveButton中添加: //用于不关闭对话框 try { Field field = dialog.ge...

Android让AlertDialog点击确定不会消失

在Android的alertDialog中,使用自带的button,点击确定或者取消,都会关闭对话框。但我们有时候希望比如点击确定的时候发现他有没填的选项,我们提示他填写完整,这个时候不关闭对话框。当...
  • howlaa
  • howlaa
  • 2014年12月31日 09:53
  • 4896

Android 屏幕适配——关于布局文件中dp 的使用

一、找一种主流屏幕做一个参考,其他的机型稍微适配 我们知道UI 设计的图已经标注都是以 px 为单位设计的。 通常我们需要根据UI设计的 图来进行一个转换操作,讲px 单位转换成我们android...

Android屏幕适配之布局设置(二)

书接上回,我们已经了解了一些关于适配的一些相关概念,接下来我们会了解一下,在设置布局时我们应该注意的地方。尽量不去设定具体的尺寸值。为了确保布局适应各种尺寸的屏幕,在保证功能实现的前提下,最好不要写死...

Android多分辨率和多屏幕的布局适配详解

说到Android的适配一定会让很多的人头疼,我在这里发表下我对Android适配上的经验。 在我们项目当中一般创建Android工程只有一个布局layout文件,其实这个布局文件有很多属性,例...
  • dzhj11
  • dzhj11
  • 2013年05月30日 09:17
  • 759

Android屏幕适配不同的资源图片、布局

Android屏幕适配不同的资源图片、布局 分类: Android 2012-03-05 10:50 147人阅读 评论(0) 收藏 举报 1、         资源图片...

Android 布局 屏幕适配

一、关于布局适配建议 1、不要使用绝对布局 2、尽量使用match_parent 而不是fill_parent 。 3、能够使用权重的地方尽量使用权重(android:layout_...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android屏幕适配之使用布局别名
举报原因:
原因补充:

(最多只允许输入30个字)