【UI篇4】关于布局的思考

不积跬步,无以至千里,不积小流,无以成江海

前言
自从业以来,关于Layout,Google更新添加了多次,一直未进行整体的思考和总结。时间一长,便越发地感觉混乱和不清晰,遂决定抽时间思考整理一下,一是为了让自己的思路更加清晰;二是作为忘记时可以顺手捡起的笔记。

布局

Google官方指南的定义为:布局定义了应用中的界面结构,布局中的所有元素均使用ViewViewGroup对象的层次结构进行构建。

一、布局的分类

视图的设计原则是:嵌套的布局越少,布局的绘制速度越快(扁平的视图层次结构优于深层的视图层次结构),应尽量使用可以保持布局层次结构扁平的布局。

为了熟练使用布局,我们必须对布局的分类以及用法如数家珍,以下即列出常用的布局。

1. LinearLayout(线性布局)

用于使所有子视图在单个方向保持对齐,目前Google官方推荐改用ConstraintLayout

2. RelativeLayout (相对布局)

以相对位置显示子视图的视图组,目前Google官方推荐改用ConstraintLayout

偏移margin和填充padding
Margin:设置组件和父容器的边距,又叫偏移
Padding:设置组件内部元素间的边距,又叫填充

3. FrameLayout(帧布局)

默认从左上角渲染,新的元素覆盖之前的元素

  • 前景图像:永远处于帧布局最上面,不会被覆盖
    有两个特有的属性:
    android:foreground: 设置该帧布局容器的前景图像
    android:foregroundGravity:设置该前景图像显示的位置
4. GridLayout(网格布局)

以网格形式显示子View

1.可以设置布局中组件的排列方式
2.可以自定义网格行数、列数
3.可以定义组件位于几行几列
4.容器中的组件可以跨多行也可以跨多列

  • 设置行数、列数:(1)android:rowCount 网络布局行数;(2)columnCount:网络布局列数
  • 设置组件所在行列:(1)android:layout_row 设置组件位于行;(2)android:layout_column 设置组件位于列
  • 设置组件横跨几行几列:(1)android:layout_rowSpan 纵向横跨x行;(2)android: columnSpan 横向横跨x列;(3)内容在行列中横跨时必须设置android:layout_gravity="fill"
5. TableLayout(表格布局)

界面元素以表格显示,以行和列显示子级view元素
加一个tableRow就会增加一行,而TableRow中子控件数量决定列数,TableLayout的列数由所有tableRow中最多组件个数决定。

  • orientation属性:固定为horizontal,layout_width不可设置
  • 常用属性:(1)shrinkColumns,设置可收缩的列;(2)stretchColumns,设置可被拉伸的列;(3)collapseColumns,设置需要隐藏的列;列的索引从0开始
  • 子控件常用属性:(1)layout_column:第几列;(2)layout_span:合并这么多单元格,也就是这个组件占据列数
6. ConstraintLayout (约束布局)

Android Studio默认布局,主要是为了解决布局嵌套过多的问题

  • 相对定位:类似属性layout_constraintLeft_toLeftOf
  • 角度定位:用角度+距离确定定位
  • 边距:定义控件的margin时,指明constraint的相对位置
  • view隐藏时,view设置自适应调整边距:layout_goneMarginStart
  • 居中:居中,取值为parent时表示与父容器对齐,类似layout_constraintEnd_toEndOf
  • 偏移:layout_constraintHorizontal_bias 水平偏移比例,从最左到最右:取值范围为0-1
  • 尺寸限制:可以为constraintLayout自身定义最小和最大大小,类似于minWidth, maxWidth
  • 尺寸百分比:布局尺寸随比例变化,取值范围0-1,对应宽/高须设置为0dp,类似于constraintHeight_percent 控件在父布局中的高占比, layout_constraintDimensionRation指宽高比
  • :(1)实现约束功能,链对当前方向上进行了约束,但对另一个方向无效,两个方向约束独立;(2)分组共享空间,链提供了分组功能,其包含了多个组件,这些组件共享水平方向上的空间。(3)类似LinearLayout的weight权重属性,但功能比前者还强大 ;(4)然后用layout_constraintHorizontal_chainStyle属性改变整个链条的样式,属性的不同取值得到不同的布局方式
7. CoordinateorLayout (协调者布局)

需要研究补充上

8. WebView (网页视图)
9. CardView(卡片式布局)

用于在卡片内显示信息。这些卡片会以默认高程绘制到屏幕上,可以使用card_view:cardElevation属性为卡片提供自定义高程。高程值越大,绘制的阴影越明显,高程值越小,阴影越淡。

  • 如需设置卡片的背景色,请使用card_view:cardBackgroundColor 属性,有时会遇到不生效的情况,这里未去深究。。。
  • android:elevation=" " 设置该属性使控件有一个阴影,感觉该控件像是“浮”起来一样,达到3D效果
  • android:translationZ="" 设置该组件阴影在Z轴(垂直屏幕方向)上的位移
  • app:cardMaxElevation=" " 设置z轴的最大高度
  • 可以通过foreground属性使用系统定义好的RippleDrawable: selectableItemBackground点击的涟漪效果
    Z属性可以通过elevation和translationZ进行修改
    Z= elevation+translationZ

需要注意的是:CardView的圆角会有毛边,如果不满足要求的情况下,需要自定义。

二、 控件的介绍

Android 原生核心控件一览

1. TextView 文本框

TextViewdrawableTop CompoundDrawable

2. EditText 输入框
3. Button 按钮

按钮包含文本或图标,可表明当用户触摸它时会引发哪种操作。

4. RadioButton 单选按钮

单选按钮可让用户从一系列选项中选择一个选项。对于可选项相互排斥的情况,如果您认为用户需要并排看到所有可用选项,则应使用单选按钮。如果没必要并排显示所有选项,则应改用Spinner


关键类

  • RadioGroup
5. CheckBox 复选框

复选框可让用户从一系列选项中选择一个或多个选项。通常,您应以垂直列表形式显示每个复选框选项。


6. ToggleButton 开关按钮

通过切换按钮,用户可在两种状态之间更改设置。


7. Switch 开关
8. ProgressBar 进度条
9. ScrollView 滚动条
10. Spinner 微调框

微调框提供了一种方法,可让用户从值集内快速选择一个值。默认状态下,微调框显示其当前所选的值。轻触微调框可显示下拉菜单,其中列有所有其他可用值,用户可从中选择一个新值。



关键类

  • SpinnerAdapter
  • AdapterView.OnItemSelectedListener
// Get a Spinner and bind it to an ArrayAdapter that
// references a String array.
val spinner1: Spinner = findViewById(R.id.spinner1)
val adapter1 = ArrayAdapter.createFromResource(
        this, R.array.colors, android.R.layout.simple_spinner_item)
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner1.adapter = adapter1
11. AdapterView

AdapterView 是一个 ViewGroup,用于显示加载到适配器中的项。最常见的适配器类型来自基于数组的数据源。
AdapterView 子类:
[ListView](https://developer.android.com/reference/android/widget/ListView),
[GridView](https://developer.android.com/reference/android/widget/GridView),
[Spinner](https://developer.android.com/reference/android/widget/Spinner)
[Gallery](https://developer.android.com/reference/android/widget/Gallery)

Adapter 子类:

  • ArrayAdapter:数据源为数组时使用
  • SimpleCursorAdapter:数据来自Cursor时使用
  • SimpleAdapter: 图文混搭,常用
  • 自定义Adapter(继承BaseAdapter):最灵活

三、布局的使用

布局的使用技巧:如果布局的内容是动态内容或未预先确定的内容,则可以使用 AdapterView 的布局,在运行时用视图填充布局。通过将AdapterView实例与Adapter绑定来填充AdapterView。

AdapterView 子类:
Adapter 子类:

  • ArrayAdapter:数据源为数组时使用
  • SimpleCursorAdapter:数据来自Cursor时使用
  • SimpleAdapter: 图文混搭,常用
  • 自定义Adapter(继承BaseAdapter):最灵活

四、 界面的开发

拿到视觉稿开始,我们要做的就是按照以下的步骤进行分析拆解:

  1. 界面分析
    层结构分析(层间叠加关系)--> 页面布局分解(纵向分解-->横向分解)-->子布局分解
  2. 布局设计
    需求澄清-->最佳布局方案(抽象公用布局 id浪费、merge标签减少层次、懒加载)-->性能核查(线性布局权重会导致多一次onMeasure、onLayout, GPURender核查渲染性能)
  3. 分辨率适配
  4. 处理兼容模式
  5. 特效设计

五、常见属性解读

此处想到了再补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容