androidui布局适配,Android适配全⾯总结(⼀)----屏幕适配前⾔
Android适配是⼀个⽼⽣常谈的问题,很多程序员觉得很恶⼼,不愿意做适配,但是⼜不得不做。然后⽼板说,这位兄弟,做好了,今天晚饭给你加个鸡腿,然后程序员开始各种资料,忙活起来了,最终在苦逼的煎熬中做完了。
好了,⾔归正传,根据多年开发经验,总结⼀下Android适配主要表现在以下 3个⽅⾯:1、屏幕适配。(⽹上讲的最多的就是这个。) 由于Android碎⽚化严重,导致开发中⼀套代码在不同⼿机上运⾏起来效果不是很好,兼容性不是很好,这就需要对不同分辨率,不同屏幕⼤⼩的⼿机做屏幕适配。
2、版本适配。 不同的系统版本api有所变更,既要适配⾼版本,也要做到兼容低版本。
3、ROM适配。(这个是最难的,⼯作量也是最⼤的,如果没有不同版本⼿机适配的积累,遇到问题都不知道怎么解决。) 由于Android是开源的,不同的⼿机⼚商有⾃⼰定制的ROM,对系统的api可能有变更,也有可能新增⼀些api,所以在开发中,要针对不同⼚商的⼿机做⼀些特殊适配。
废话少说,开始进⼊正题。这篇⽂章我们先讲解第⼀个问题 ---- 屏幕适配。
⼀、屏幕适配是啥(可能有⼈不懂,我在此简单解释⼀下)?程序猿把设计狮制作的效果图应⽤到不同的⼿机,对不同的屏幕进⾏界⾯调整的过程,确保界⾯不变形,呈现效果图的位置、尺⼨、⽐例。
⼆、需要掌握的⼏个知识点。(1)屏幕物理尺⼨:
屏幕对⾓线的尺⼨。单位是英⼨,1英⼨ ≈ 2.54厘⽶⽐如常见的屏幕尺⼨有5.0、5.1、5.2、5.5、5.7、5.9、6.0等(2)屏幕分辨率:定义:
确定计算机屏幕上显⽰多少信息的设置,以⽔平和垂直像素来衡量。
计算公式:屏幕分辨率 = 横向像素*纵向像素(或者 宽x⾼),如 1080*1920单位:
单位是px,1px=1个像素点。
常见分辨率:720x1280、1080x1920(当然还有480x800,这个很少见了)(3)屏幕像素密度(dots per inch)含义:每英⼨上的像素点数。
屏幕像素密度与屏幕尺⼨和屏幕分辨率有关,在单⼀变化条件下,屏幕尺⼨越⼩、分辨率越⾼,像素密度越⼤,反之越⼩。
单位:dpi(dots per inch)
假设设备内每英⼨有240个像素,那么该设备的屏幕像素密度=240dpi
不同⼿机屏幕⼤⼩对应的屏幕像素密度关系表:密度类型代表的分辨率(px)屏幕像素密度(dpi)低密度(ldpi)240x320120
中密度(mdpi)320x480160
⾼密度(hdpi)480x800240
超⾼密度(xhdpi)720x1280320
超超⾼密度(xxhdpi)1080x1920480当然与像素有关的还有⼀个单位ppi,这个我们安卓中⽤不到,有兴趣的可以百度⼀下。(4)以上三者(屏幕尺⼨、分辨率、像素密度)之间的关系
屏幕尺⼨、分辨率、像素密度之间的换算图(5)密度⽆关像素(dp 或 dip)单位:dp,可以保证在不同屏幕像素密度的设备上显⽰相同的效果Android开发设置布局和控件宽⾼,⽤dp⽽不是px,dp是Android特有的单位
dp与px的转换
因为ui给的图是以 px 为单位的,Android开发则是使⽤ dp 作为单位的,那么我们需要进⾏转换:
在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px
(6)独⽴⽐例像素(sp)单位:sp
Android开发时⽤sp设置⽂字⼤⼩,使⽤它可以根据⽂字⼤⼩⾸选项进⾏放缩。
不推荐使⽤奇数和⼩数,容易造成精度的丢失问题;⼩于12sp的字体会太⼩导致⽤户看不清。
下⾯给⼀个实例说明,让你更能明⽩这⼏个单位:
看下图你可以知道:为什么使⽤了dp作为单位,两个⼿机分辨率也是⼀样的,可是按钮显⽰的宽度还是不⼀样?
三、屏幕适配的本质
总结⼀下,主要有以下两点:(1)使得“布局”、“布局组件”、“图⽚资源”、“⽤户界⾯流程”匹配不同的屏幕尺⼨
(2)使得“图⽚资源”匹配不同的屏幕密度
四、屏幕适配具体的解决⽅案
⾸先看⼀张图:
屏幕适配 具体实现⽅式
4.1 屏幕尺⼨适配4.1.1.布局适配4.1.1.1. 使得布局元素⾃适应屏幕尺⼨
解决⽅案:使⽤相对布局(RelativeLayout),禁⽤绝对布局(AbsoluteLayout)。这个很基础,就不多说了。4.1.1.2. 根据屏幕的配置来加载相应的UI布局。为不同屏幕尺⼨的设备设计不同的布局。
解决⽅案:使⽤限定符。通过配置限定符使得程序在运⾏时根据当前设备的配置(屏幕尺⼨)⾃动加载合适的布局资源。
限定符分类:
(1)尺⼨(size)限定符(这种⽅式只适合Android 3.2版本之前)
res⽬录新建⼀个layout-large⽂件夹,布局名字和res/layout⾥⾯的同名。在平板电脑和电视的屏幕(>7英⼨)上:实施 双⾯板 模式以同时显⽰更多内容,它会加载res/layout-large⾥⾯的布局,在⼿机较⼩的屏幕上:使⽤ 单⾯板 分别显⽰内容,加载的是res/layout⾥⾯的同名布局。
尺⼨(size)限定符
(2)最⼩宽度(Smallest-width)限定符。
通过指定某个最⼩宽度(以 dp 为单位)来精确定位屏幕从⽽加载不同的UI资源。(适⽤于Android 3.2及之后版本)
最⼩宽度限定符可让您通过指定某个最⼩宽度(以 dp 为单位)来定位屏幕。例如,标准 7 英⼨平板电脑的最⼩宽度为 600 dp,因此如果您要在此类屏幕上的⽤户界⾯中使⽤双⾯板(但在较⼩的屏幕上只显⽰列表),您可以使⽤上⽂中所述的单⾯板和双⾯板这两种布局,但您应使⽤ sw600dp 指明双⾯板布局仅适⽤于最⼩宽度为 600 dp 的屏幕,⽽不是使⽤ large 尺⼨限定符。
最⼩宽度(Smallest-width)限定符
(3)布局别名
为了解决⽂件名的重复从⽽带来⼀些列后期维护的问题,我们使⽤ 布局别名 ⽅案。
通过以上两点,⼤家也会发现⼀个问题:
适配⼿机没问题。但是适配平板发现Android3.2前后的这两个⽂件内容是⼀样的,只是⽂件名不同⽽已。适配⼿机的单⾯板(默认)布局:res/l
适配尺⼨>7⼨平板的双⾯板布局(Android 3.2前):res/l
适配尺⼨>7⼨平板的双⾯板布局(Android 3.2后)res/l
解救⽅案:取⼀个别名就好了,⽰例如下:
布局别名
这样两个l都只是引⽤了@layout/main_twopanes,就避免了重复定义布局⽂件的情况
(4)屏幕⽅向(Orientation)限定符。
根据屏幕⽅向进⾏布局的调整。
某些布局会同时⽀持横向模式和纵向模式,但我们可以通过调整优化其中⼤部分布局的效果。每种屏幕尺⼨和屏幕⽅向下的布局⾏为⽅式如下所⽰:⼩屏幕,纵向:单⾯板,带徽标
⼩屏幕,横向:单⾯板,带徽标
7 英⼨平板电脑,纵向:单⾯板,带操作栏
7 英⼨平板电脑,横向:双⾯板,宽,带操作栏
10 英⼨平板电脑,纵向:双⾯板,窄,带操作栏
10 英⼨平板电脑,横向:双⾯板,宽,带操作栏
电视,横向:双⾯板,宽,带操作栏
解决⽅案:
第⼀步:先定义类别:单/双⾯板、是否带操作栏、宽/窄定义在 res/layout/ ⽬录下的某个 XML ⽂件中
第⼆步:再进⾏相应的匹配:屏幕尺⼨(⼩屏、7⼨、10⼨)、⽅向(横、纵)使⽤布局别名进⾏匹配
⽰例代码如下图所⽰:
屏幕⽅向(Orientation)限定符
这⾥没有完全把全部尺⼨匹配类型的代码贴出来,⼤家可以⾃⼰去尝试把其补充完整。4.1.2. 布局组件适配
使得布局组件⾃适应屏幕尺⼨。解决⽅案:使⽤"wrap_content"、"match_parent"和"weight“来控制视图组件的宽度和⾼度。这个很基础,这⼏个的⽤法⼤家应该都经常⽤的,就不多说了。4.1.3. 图⽚资源适配
使得图⽚资源在不同屏幕密度上显⽰相同的像素效果。
在实际开发中⼀个按钮的背景图⽚必须能够随着按钮⼤⼩的改变⽽改变。使⽤普通的图⽚将⽆法实现这个效果,因为运⾏时会对图⽚均匀地拉伸或压缩。解决⽅案:使⽤⾃动拉伸位图(nine-patch图⽚),后缀名是.9.png,它是⼀种被特殊处理过的PNG图⽚,设计时可以指定图⽚的拉伸区域和⾮拉伸区域;使⽤时,系统就会根据控件的⼤⼩⾃动地拉伸你想要拉伸的部分。
注意事项:1.必须使⽤UI给的图⽚格式(.9.png后缀),随意更改后缀使⽤在项⽬中会报错,因为系统就是根据这个来区别nine-patch图⽚和普通的PNG图⽚的。
2.部分nine-patch图⽚在Android Studio项⽬中不能识别,会报错,需要谨慎使⽤。
下⾯⼀张图看看使⽤nine-patch图⽚的效果:
使⽤ nine-patch 图⽚的效果
nine-patch图⽚制作请参考我的博客:
nine-patch图⽚的制作4.1.4. ⽤户界⾯流程适配
根据屏幕的配置来加载相应的⽤户界⾯流程。使⽤场景:我们会根据设备特点显⽰恰当的布局,但是这样做,会使得⽤户界⾯流程可能会有所不同。
例如:如果应⽤处于双⾯板模式下,点击左侧⾯板上的项即可直接在右侧⾯板上显⽰相关内容;⽽如果该应⽤处于单⾯板模式下,点击相关的内容应该跳转到另外⼀个Activity进⾏后续的处理。
解决⽅案(最终⽬的是进⾏⽤户界⾯流程的⾃适应配置,其实就是⽤java代码动态加载):
① 确定当前布局。⽰例如下:
由于每种布局的实施都会稍有不同,因此我们需要先确定当前向⽤户显⽰的布局。
例如,我们可以先了解⽤户所处的是“单⾯板”模式还是“双⾯板”模式。
确定当前布局
② 根据当前布局做出响应。⽰例如下:
有些操作可能会因当前的具体布局⽽产⽣不同的结果。
例如,在新闻阅读器⽰例中,如果⽤户界⾯处于双⾯板模式下,那么点击标题列表中的标题就会在右
侧⾯板中切换到相应报道(Fragment);但如果⽤户界⾯处于单⾯板模式下,那么上述操作就会启动⼀个独⽴Activity:
根据当前布局做出响应
③ 重复使⽤其他 Activity 中的 Fragment。⽰例如下:
例如,在新闻阅读器⽰例中,对于较⼤的屏幕,新闻报道⽂本会显⽰在右侧 Fragment ⾯板中;但对于较⼩的屏幕,这些⽂本就会以独⽴Activity 的形式存在。
重复使⽤其他 Activity 中的 Fragment
④ 处理屏幕配置变化。⽰例如下:
如果我们使⽤独⽴Activity实施界⾯的独⽴部分,那么请注意,我们可能需要对特定配置变化(例如屏幕⽅向的变化)做出响应,以便保持界⾯的⼀致性。
例如,在运⾏ Android 3.0 或更⾼版本的标准 7 英⼨平板电脑上,如果新闻阅读器⽰例应⽤运⾏在纵向模式下,就会在使⽤独⽴Activity 显⽰新闻报道;但如果该应⽤运⾏在横向模式下,就会使⽤双⾯板布局。
处理屏幕配置变化
4.2 屏幕密度适配4.2.1.布局控件适配
使得布局组件在不同屏幕密度上显⽰相同的像素效果。
解决⽅案有以下两种:(1)使⽤ 密度⽆关像素 ( dp ) 或 独⽴⽐例像素( sp ) 作为计量单位。1. 使⽤dp来代替px作为控件宽⾼的统⼀度量单位。
android平板电脑价格2. 使⽤sp作为⽂字的统⼀度量单位。使⽤场景:假如同样都是画⼀条长度是屏幕⼀半的线,如果使⽤px作为计量单位,那么在480x800分辨率⼿机上设置应为240px;在320x480的⼿机上应设置为160px,⼆者设置就不同了;如果使⽤dp为单位,在这两种分辨率
下,160dp都显⽰为屏幕⼀半的长度。
dp 和 px 的转换在前⾯有介绍,这⾥就不说了。
为了能够进⾏不同屏幕像素密度的匹配,应该这样做:
有下⾯⼀种场景:
RelativeLayout布局⾥⾯,⽔平⽅向上放置两个按钮,⼀个是150dp左对齐,另外⼀个是200dp右对齐。在屏幕总宽度为360dp的Nexus5上中间有10dp的间隙。但同样地设置在Nexus S(屏幕宽度是320dp),会发现,两个按钮会重叠,因为320dp<200+150dp。
如图:
Nexus5 效果
Nexus S 效果
从上⾯可以看出,由于Android屏幕设备的多样性,如果使⽤dp来作为度量单位,并不是所有的屏幕的宽度都具备相同的dp长度。
dp解决了同⼀数值在 不同分辨率 中展⽰ 相同尺⼨⼤⼩ 的问题(即屏幕像素密度匹配问题),但却没有解决设备 尺⼨⼤⼩匹配 的问题。(即屏幕尺⼨匹配问题)。注意:屏幕宽度和像素密度没有任何关联关系。(2)使⽤像素作为计量单位,采⽤百分⽐布局。从上⾯案例看出,因为屏幕密度(分辨率)不⼀样,所以不能⽤固定的px;因为屏幕宽度不⼀样,所以要⼩⼼的⽤dp。
因为本质上是希望使得布局组件在不同屏幕密度上显⽰相同的像素效果,那么,之前是绕了个弯使⽤dp解决这个问题,那么到底能不能直接⽤px解决呢?当然是可以的。根据不同屏幕密度,控件选择对
应的像素值⼤⼩。解决⽅法是: 百分⽐适配。
先说⼀下缺点:
使⽤像素作为计量单位的适配⽅式,应该能进⾏90%的适配了,但其 缺点 还是很明显:1.由于实际上还是使⽤px作为长度的度量单位,所以和google的要求使⽤dp作为度量单位会有所背离
2.必须尽可能多的包含所有分辨率,因为这个是使⽤这个⽅案的基础,如果有某个分辨率缺少,将⽆法完成该屏幕的适配
3.过多的分辨率像素描述xml⽂件会增加软件包的⼤⼩和维护的难度
1.以某⼀分辨率为基准,⽣成所有分辨率对应像素数列表
现在我们以320x480的分辨率为基准:
将屏幕的宽度分为320份,取值为x1x320,将屏幕的⾼度分为480份,取值为y1y480
然后⽣成该分辨率对应像素数的列表,如下图:
基准分辨率像素列表
到基准后,是时候把其他分辨率补全了,以下是以1080x1920的分辨率为例:
关于⾃动⽣成values⽂件夹,这⾥推荐两个⼯具:
① AndroidPixelDimenGenerator ,使⽤⽅式可以百度⼀下,这不是本⽂的重点。
② 张鸿洋⼤神写的autolayout.jar这个⼯具,下载地址请点此 ,使⽤⽅法如下图所⽰:
⾃动⽣成values⽂件夹以及对应的l⽂件.gif
2.将⽣成像素数列表存放在res⽬录下对应的values⽂件下,这个步骤上⾯的动态图已经做了。
注意事项:(1)对应分辨率的资源⽂件应放在res/values对应的⽂件夹中。⽐如分辨率为1920x1080的资源⽂件应放在res/values-
1920x1080⽂件夹中。
(2)必须在默认values⾥⾯也创建对应默认l和l⽂件,只是单位是dp。如果默认values⽂件夹没有(即没有对应的分辨率、没有对应dimen)就会报错,从⽽⽆法进⾏屏幕适配。
3.根据UI设计师给出设计图上的尺⼨,到对应像素数的单位,然后设置给控件即可。如下图:
android:layout_gravity="center"
android:gravity="center"
android:text="@string/hello_world"
android:layout_width="@dimen/x160"
android:layout_height="@dimen/y160"/>
4.2.2.图⽚资源适配
使得图⽚资源在不同屏幕密度上显⽰相同的像素效果。解决⽅案:提供备⽤位图(符合屏幕尺⼨的图⽚资源)
常见做法步骤如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论