A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 就业部_安卓组 于 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 进阶篇总贴
       点此进入:Android 讨论区

       以上言论,如有错误或者表达不准确或者有纰漏的地方还请指正,同时欢迎大家在评论区留言给予一定的建议,我会根据大家的意见进行相应的改正,谢谢各位!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马