小白7码-android原生开发皮毛系列(6)-LinearLayout线性布局

过去一段时间,小白因为一些客观原因,不管是工作上还是个人生活上都发生一些巨大的变化,所以不得不停笔藏牍。对于android原生开发也在断断续续的进行着。期间有两件比较高兴的事情可以和大家做一个分享:首先小白开发的第一款android原生开发应用经过几个月将近半年时间的开发终于上线投入使用,希望它可以继续成长下去。另一个是加入了一个QQ android学习群,遇到了一些很nice的伙伴,也分享了一些有用的知识帮到了一些人,是一个特别开心的事情。所以经过一段时间,小白还是觉得要把小白系列继续下去,留下自己学习android原生开发的足迹,也能分享给你们。

接下来,小白会开始android原生开发皮毛系列的新的章节,主要关于android原生开发的中的布局和列表容器等控件的使用。其中布局涉及到一些基本的控件:LinearLayout, RelativeLayout,FrameLayout,ConstraintLayout以及CoordinatorLayout布局。在这一小节,小白将记录LinearLayout布局控件。

首先,我们需要明白布局是什么?是对事物的规划和安排?!别闹,整这么高级干嘛?一句话说就是我们想在界面的哪个的地方展示某某某。布局就是帮助我们安排界面的工具,当然单个布局控件无法帮助我们完成比较复杂的界面布局的,所以通常需要通过组合,嵌套等多种布局应用方法来实现。

所谓工欲善其事,必先利其器,不积跬步无以至千里。布局中最简单的就是横躺竖卧,纵横交错,那么在android布局中就叫做线性布局,对应的布局控件就是LinearLayout。在介绍LinearLayout的使用前,先八卦一个小的问题,那就是亲爸谷歌对LinearLayout这个儿子不是很待见,给出的理由是性能,当然小白相信针对LinearLayout的这个理由是真的。LinearLayout在深度使用的时候是会产生性能问题,但是这是谷歌早期设计LinearLayout时候埋下的坑。但是对于常规的使用,不重度嵌套和依赖权重,LinearLayout并不会带来性能问题,毕竟亲爸谷歌很多内建的控件不是还是偷偷用LinearLayout么。所以对于这个问题,小白猜测真相有两个方面:一个是LinearLayout的重度使用确实会有性能问题,第二个为亲爸谷歌的新欢ConstraintLayout让路。但是小白觉得这路数不正。好了,言归正传,还是让我们好好了解一下LinearLayout的使用吧。

横向 & 竖向

LinearLayout最基本的用法类似于Web中流式布局中最基础的形式,就是从上到下,从左到右。但是LinearLayout无法做到同时从上到下,从左到右,我们只能二选一,这就是LInearLayout的横向或者竖向的选择,由LinearLayout的orientation属性控制, 如图1所示:

                                                 图 1. LinearLayout的横向和竖向设置

在上面的例子中,我们可以看到两个主要元素: 图片和书名,那么在横向时候,我们怎么做呢?首先需要将LinearLayout的orientation设置为horizontal即从左到右,然后在LinearLayout中丢一个ImageView和TextView用于显示图片和书名如图2所示:

                                                  图2 LinearLayout横向事例代码

而要想LinearLayout从上到下显示,可以将orientation设置为vertical,那么上面的事例就可以变成图3所示:

                                                    图3 LinearLayout竖向事例代码

那么为什么谷歌不设计一个可以同时从上到下,从左到右的布局控件?小白猜测真相是为了节约性能,毕竟早期的移动设备的性能确实无法与同时期的箱式电脑相比,而且Web流式布局需要消耗比较大的算力。如果猜测成真,那么LinearLayout无疑是有缺陷的,不然ConstraintLayout就不会存在了。

权重

对于LinearLayout一个很重要的概念是绕不过去的,那就是权重。权重简单来说就是比例,用于分配空间的比例,当然这个比例需要通过计算得出,而权重就是帮助计算比例的一个数值。但是权重还有设置和不设置的选择,所以此外还得考虑权重不设置以及LinearLayout内部控件大小溢出等情况,所以总的来说会比较复杂。

没有权重

小白在使用LinearLayout横向模式时,经常忽略一个事实是就是LinearLayout在横向模式下,是可以不用设置权重的。那么不设置权重,LinearLayout会什么样的表现呢? 首先小白先上一个正常设置了权重的的实例:

                                                            图4 正常有权重实例

在上面实例里,我们总共有三个元素:

  1. 固定尺寸的图书图标图片

  2. 带权重的书名文本

  3. 固定尺寸的功能性小图标

那么如果我们去掉LinearLayout所有子元素的layout_weight即去除权重,并且给子元素赋予有效的宽度值。例如把书名文本的layout_weight去掉,并且将它的layout_width设置为wrap_content, 那么最后的效果就如下图所示:

                                                              图5 无权重实例

如上图所示,如果去掉权重,那么LinearLayout不会计算控件空间比率,而是顺序根据子控件的空间大小以次显示。如果没有多余的空间显示下控件的任何一部分,即使压缩控件的空间也不能达到显示的目的,将不会显示。

有无权重搭配

上面小白描述了无权重下,LinearLayout会如何处理内部控件的布局,但是如果我们给其中一个或者多个但不是全部控件设置权重。正如上面图4的事例中所示,我们给一个书名文本添加上权限,那么LinearLayout的工作模式又将变得不同。首先,它会首先根据无权重设置的控件的需要的空间,然后通过剩余空间根据权重再计算权重控件的空间,最后再根据计算结果去以次显示控件。这也就是为什么LinearLayout深度使用会产生性能原因的一个原因。然而实际情况可能比小白描述可能还要复杂,所以这里有几点建议和注意事项:

  1. 在LinearLayout横向模式下,如无必要,不要给子控件的layout_width设置match_parent,match_parent会让子控件去占据LinearLayout所有空间而直接填满LinearLayout或者让其他控件不能显示。
  2. 如果LinearLayout同时有无权重和有权重的子控价,那么最好预估一下无权重的子控价可能需要的空间,然后给这些无权重的子控价设置一个固定的layout_width。因为这样的话,我们如果有多个LinearLayout布局构成列表布局时候,可以让页面元素上下对齐,更加整洁美观。
  3. 尽量不要给多个LinearLayout子控价设置权重,因为多个带有权重的子控价会出现不可预测的显示表现。

所以,小白在这里推荐一种用法:在LinearLayout横向模式下,仅给一个需要显示尽可能多内容的子控件设置权重,其他控件通过预估设置一个合理的固定layout_width,总体的子控件数控制在5个以内,最好是3个。原因是它比较稳定。

全比例权重

那么如果给所有LinearLayout的子控件配备配备权重,那么LinearLayout又会怎么表现?其实它和有无权重搭配的表现是一样,唯一不同的是这种模式下,LinearLayout会根据权重比例来,如下图所示:

                                                                      图6 比例权重

如上图所示,小白将图书图片,书名文本和操作按钮做了2:6:1的比例划分,LinearLayout会根据比例自动分配。我们通常需要做的就是预计LinearLayout里的每一部分占有整个LinearLayout的空间的比例。另外,当LinearLayout分配的空间小于子控件最小空间需求即LinearLayout分配空间完全无法显示下某个子控件时候,那么很多意想不到的情况就会发生。但是通常来说,这个概率通常不大。

最后,关于LinearLayout小白就记录到这里,通常记住简单横竖布局用LinearLayout。此外尽量避免深度使用权重和LinearLayout的深层次嵌套,使用相对稳定的比例分配模式。另外多一句嘴layout_below, layout_above, layout_centerVertical等跟LinearLayout半毛钱关系都没有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享