黑马程序员技术交流社区
标题: 【进阶】Android 屏幕适配(二) [打印本页]
作者: 张老师 时间: 2016-10-12 16:30
标题: 【进阶】Android 屏幕适配(二)
本帖最后由 就业部_安卓组 于 2016-11-25 16:03 编辑
上篇 介绍了为什么要做屏幕适配、当前 Android 的生态、屏幕适配的一些单位和概念(必须掌握),既然问题抛出来了,那我们这节我们来谈一谈解决方案。
没时间解释了,赶紧上车。
解决方案
一般都是采用以下几种适配的方案:
1.布局适配
2.权重适配
3.代码动态设置
4.图片适配
5.dp 适配
6.百分比适配
布局适配
这种适配方案基本上不怎么使用了,因为实在是太耗费资源,试想一下。多写一套布局,而大部分的代码都是相同的,纯粹是为了适配而做的这些事情,无疑增加了开发者的负担以及使程序变得更冗余和庞大,我个人认为,实在是得不偿失。
权重适配
这是 LinearLayout 的特有属性:weight,意味权重,我们可以让界面布局按照我们设定的比例来显示。比如,现在有个需求,要求界面上有两个控件,一个占屏幕宽的1/3,另一个占屏幕宽的2/3。
可以这样编写代码,如下:
文本1的weight=1,宽度为0dp
文本2的weight=2,宽度为0dp
而显示效果就是文本1的宽度占了1/(1+2),文本2的宽度占了1/(1+2),如上图所示,这样就很好的完成了需求。
但我希望你能明白权重的计算规则,权重的意思是控件的大小等于自身大小加上占剩余空间的比例。注意是剩余空间的比例,什么意思呢?
先看另外一种效果。
与之前相比,我只改了一个属性,就是把文本1和文本2这两个TextView的宽度改成了match_parent。
然而结果却变了个样,本该显示1/3的文本1却占了2/3,而文本2却变成了1/3。
再来看一下刚才那句话,什么叫剩余空间呢?
当前的LinearLayout的orientatioin为横向,两个TextView的weight分别是1和2。
先分析第一种情况,就是当宽度为0dp的时候。
假设说屏幕的宽度为L,现在该屏幕下有两个控件,两个控件的宽度为0,那剩余空间就等于L-(0+0)=L。
文本1的weight=1,那么它的宽度:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
0 + L * 1/(1+2) = 1/3 L
同理,文本2的宽度为:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
0 + L * 2/(1+2) = 2/3 L
因此当宽度设置为0dp的时候,显示效果就是1:2的关系。
再来讨论当宽度设置为match_parent的时候的情况,就是当控件的宽度为 L 的时候。
现在屏幕的宽度为L,现在这两个控件的宽度都为L,那剩余空间就等于L-(L+L) = -L。
文本1的weight=1,那么它的宽度:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
L + -L * 1/(1+2) = 2/3 L
同理,文本2的宽度为:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
L + -L * 2/(1+2) = 1/3 L
因此当宽度设置为0dp的时候,显示效果就是2:1的关系。
这就是权重的计算规则,很多人面试都遇到过。
这是横向的只测试了宽的权重,其实高也是一样,这里不做讲解,贴两张图,改动的地方我会标记出来,大家自己查看,有疑问请在评论区提问。
0dp的情况
match_parent的情况
注意:
权重只有LinearLayout才有,RelativeLayout没有这个属性,虽然 Google 推荐使用RelativeLayout而不是LinearLayout。
这里多提一句为什么Google推荐使用RelativeLayout而不是LinearLayout。
在 Android 中,系统对View进行测量、布局和绘制时,都是通过对 View树的遍历来进行操作的。如果一个View 树的高度太高,就会严重影响测量、布局和绘制的速度,因此我们如果不想被影响的话,第一个方法就是要降低View树的高度,Google也在其API文档中建议View树的高度不宜超过10层。
真实项目中,大部分的根布局几乎都是RelativeLayout,因为要实现相对位置的控制,所以比较方便一些。
而最初的时候创建一个 xml 布局,Google是用 LinearLayout作为默认根布局的,而现在已经使用 RelativeLayout 作为 xml 文件默认的根布局了,原因就是希望通过扁平的 RelativeLayout来降低通过 LinearLayout 嵌套所产生布局树的高度,从而提高 UI 渲染的效率。
代码适配
有一些情况下,我们需要去动态的设置控件的大小或者是控件的位置,比如dialog或者popupwindow的偏移量或者是显示的位置等等,这个时候在xml布局里就显得有点乏力,我们可以根据当前屏幕的大小属性来设置合适的数值。
比如
[Java] 纯文本查看 复制代码
//获取屏幕高宽
DisplayMetricsmetric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
windowsHeight= metric.heightPixels;
windowsWight= metric.widthPixels;
//动态改变布局
LinearLayoutproduction_factory = (LinearLayout)findViewById(R.id.production_factory);
LayoutParamsparams = production_factory.getLayoutParams();
params.height= windowsHeight / 2;
production_factory.setLayoutParams(params);
点此进入:Android 人事+技术总贴
点此进入:Android 基础篇总贴
点此进入:Android 进阶篇总贴
点此进入:Android 讨论区
以上言论,如有错误或者表达不准确或者有纰漏的地方还请指正,同时欢迎大家在评论区留言给予一定的建议,我会根据大家的意见进行相应的改正,谢谢各位!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |