常规 & 高级 UI 编程(1) | 青训营笔记

97 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

课程主要内容

  • UI组件
  • 布局
  • 渲染
  • 交互
  • 动画
  • 自定义View

Andriod UI组件

  • UI: User Interface
  • Android系统是图形用户界面操作系统
  • UI界面由多个不同功能的UI组件构成
  • Android SDK提供了大量的UI组件

常规UI组件

image.png

常规UI组件大多由Android Framework中的android.widget这个package提供

常规UI组件的属性和方法

image.png

常规UI组件的使用

image.png

原点:在屏幕的左上角

  • margin:整个组件的边距其他的组件或父容器的边距
  • padding:文本距它的组件大小的边距
  • layout_height:整个UI组件的高度
  • layout_width:整个UI组件的宽度
  • gravity:子元素在该容器内的对齐方式
  • layout_gravity:组件相对于父容器对其方式

高级UI组件

组件Java Class
滑动组件ScrollView
列表组件ListView/RecyclerView
下拉刷新组件PullToRefresh
分页组件ViewPager
布局组件LinearLayout/RealtiveLayout/ ...

常规UI组件大多是View,高级UI组件大多是ViewGroup、比常规UI组件有更多的功能

布局

真正完成布局需要完成3个重要因素:UI组件的大小、位置、层级

LinearLayout(线性布局)

按照单一的方向去做布局(垂直方向,水平方向)

属性功能描述
android:orientation布局内组件的排列方向
aandroid:layout_weight布局内组件大小权重
android:divider布局内组件间分割线
android:showDividers布局内组件间分割线位置
android:dividerPadding布局内分割线padding
  • 以水平/垂直方向排列组件
  • 所有子视图在单个方向(垂直或水平)保持对齐
  • 适用于线性排列场景

RelativeLayout(相对布局)

  • 通过相对父容器/兄弟组件位置排列组件
  • 可以消除嵌套视图组并使布局层次结构保持扁平化,从而提高性能
  • 一个RelativeLayout就可以替换多个嵌套的LinearLayout组
  • 适用于复杂场景

FrameLayout(层级布局)

不同组件进行相应的覆盖

前景图像:永远处于FrameLayout最上层,不会被覆盖的图片

属性功能描述
android:foreground设置前景图像
android:foregroundGravity设置前景图像Gravity
  • 以层级叠加的方式排列组件
  • 适用于层级排列场景

ConstraintLayout(类似于RelativeLayout)

  • 通过约束组件位置排列组件
  • 扩展布局方式
  • 所有的视图均根据同级视图与父布局之间的关系进行布局
  • 可使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局
  • 为获得更好的性能和工具支持,推进使用ConstraintLayout
  • 适用于复杂场景

渲染

布局页面的渲染:布局加载、布局解析、UI渲染

布局加载

  1. 编写布局文件
  2. 注册Manifest
  3. 设置布局文件

setContentView

setContentView创建了DecorView,最终由LayoutInflater来加载了XML文件

布局解析

LayoutInflater

LayoutInflater解析了XML文件,并根据XML文件生成了View实例,并将View实例添加了到了其ViewGroup中

createView

根据XML中View类名来找到相应View,并将XML中的描述属性解析为AttributeSet,并作为第二个参数传给了View构造器

UI渲染

  • 页面绘制的起点:onResume()

View绘制流程

image.png

UI渲染

image.png

后记

这节课我学习了单个UI组件,多个UI组件怎么做排版,整个布局文件的生成、布局文件的解析、UI组件的生成以及到整个屏幕组建的绘制。学习到了一些比较基础的Android的UI知识,去尝试画出一些常规的界面。