本帖最后由 就业部_安卓组 于 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 讨论区
以上言论,如有错误或者表达不准确或者有纰漏的地方还请指正,同时欢迎大家在评论区留言给予一定的建议,我会根据大家的意见进行相应的改正,谢谢各位!
|