本篇文章的图片来源于Carson_Ho,原文请点击。
一、布局介绍
Android中有3种最基本的布局,分别是:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(框架布局|FrameLayout)。
(1)只有线性布局(LinearLayout)支持使用layout_weight属性,来实现按比例指定控件大小的功能。
系统会先把LinearLayout下所有控件指定的layout_weight值相加,得到一个总值。然后每个控件所占大小的比例就是用该控件的layout_weight值除以刚才算出的总值。
(2)所有布局都是直接或间接继承自ViewGroup的。
注:图片来源于Carson_Ho
二、布局的公有属性
以上5种布局都具有以下属性:
- layout_width、layout_height
- layout_margin + 方位
- padding + 方位
- gravity
- layout_gravity(一般用于LinearLayout和FrameLayout)
注:图片来源于Carson_Ho
三、布局的特有属性
注:图片来源于Carson_Ho
四、RelativeLayout
RelativeLayout是一种相对布局的控件,这个容器内部的子元素们可以使用彼此之间的相对位置或者和容器间的相对位置来进行定位,类似于网页设计中的CSS。在指定控件的位置时,我们需要指定这个控件与其它控件之间的相对位置关系,比如说与另一个控件的左边对齐,右对齐,位于另一个控件的上方,下方等等。一个控件可以指定与多个其它控件的相对位置。这样,我们就可以在设计位置灵活多变的界面时就会更加的方便。
Android RelativeLayout 属性
// 相对于给定ID控件
android:layout_above 将该控件的底部置于给定ID的控件之上;
android:layout_below 将该控件的底部置于给定ID的控件之下;
android:layout_toStartOf 将该控件的右边缘与给定ID的控件左边缘对齐; //同 android:layout_toLeftOf
android:layout_toEndOf 将该控件的左边缘与给定ID的控件右边缘对齐; //同 android:layout_toRightOf
android:layout_marginEnd 线性布局中相对后面一个组件之间的距离
五、注意事项
-
1、布局中尽量少使用ViewGroup进行多重嵌套,如果不得不使用ViewGroup多重嵌套时,不要使用LinearLayout嵌套,可以改用RelativeLayout,这样可以有效降低嵌套数。
(解释:Android应用界面上任何一个View都需要经过measure、layout、draw三个步骤才能被正确的渲染。从xml layout的顶部节点开始进行measure,每个子节点都需要向自己的父节点提供自己的尺寸来决定展示的位置,在此过程中可能还会重新measure(可能导致measure的时间消耗为原来的2-3倍)。节点所处位置越深,嵌套带来的measure越多,计算就会越费时,这也就是为什么扁平的View结构会性能更好。同时,页面出现的View越多,measure、layout、draw所花费的时间就越久。缩短这个时间的关键是保持View的树形结构尽量扁平,而且要移除所有不需要渲染的View。理想情况下,measure、layout和draw的总时间应该很好地控制在16ms以内,以保证滑动屏幕时UI的流畅。如果想要找到那些多余的View(增加渲染延迟的View),可以用Android Studio Monitor里的Hierarchy Viewer工具,可视化的查看所有的View。) -
2、禁止在非UI线程进行View相关操作。
-
3、禁止在设计布局时多次设置子View和父View中为同样的背景造成页面过度绘制,可以将不需要显示的布局进行及时隐藏。
-
4、不能使用ScrollView包裹ListView/GridView/ExpandableListView,因为这样会把ListView的所有Item都加载到内存中,要消耗巨大的内存和CPU去绘制图画。
(ScrollView中嵌套List或RecyclerView的做法官方明确禁止。除了开发过程中遇到的各种视觉和交互问题,这种做法对性能也有较大损耗。此外,ListView等UI组件自身有垂直滚动功能,也没有必要再嵌套一层ScrollView。目前,为了较好的UI体验,更贴近Material Design的设计,推荐使用NestedScrollView。)