安卓UI编程基础 | 青训营笔记

73 阅读3分钟

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

安卓UI编程

渲染

android studio 中界面采用xml编写,而实际的布局以及控件都是Java类,将xml标签内容转化为java代码的渲染过程,我们不必进行编写。程序员所关心的的步骤只有三步:

  1. 编写xml布局文件
  2. 在AndroidManifest中将activity注册
  3. 重写activity的onCreate()函数,载入布局文件

在载入布局文件时,我们只需要传入布局的id,不必关心xml到java代码的转化。但是我们可以了解一下这部分的实现逻辑。

  1. 创建decorView
  2. 找到对应的viewGroup,移除所有view
  3. inflate加载xml中的布局(解析xml),根据xml中的view名创建view,并将属性描述封装为AttributeSet进行构造

以上是控件生成的过程,而实际绘制发生在activity的onResume被将用时。具体绘制阶段如下:

1. measure:测量宽度、高度
1. layout:根据布局信息,确定绘制的位置,得到绘制的坐标
1. draw:进行实际绘制

注意onResume中只是进行绘制请求,并非是立即绘制,choreographer进行调度。因为屏幕都有一定的刷新频率,因而存在一个同步信号(Vsync),当获得一个信号后进行绘制,在此之前cpu、gpu相继进行运算。系统调度绘制请求,在一次绘制时完成多个请求的绘制。

交互

交互分为两个部分:获取view实例,添加监听器。

一般获取view示例都调用findViewById()方法,该方法最终调用的是重写的findViewTraversal()方法,迭代查找所有children,判断children的id是否符合。

触摸事件:用户与手机的交互全部是触摸,click等事件是对touch事件的封装。touch事件发生后,会获取当前window信息,然后传递给viewRootImpl进行处理,发生触摸后,会生成MotionEvent对象,包含触摸信息。

一个触摸事件可能发生在多个控件上(view,viewgroup,activity),事件会由上至下一次传递(dispatch),然后自下向上触发相应事件,该v型逻辑可以在任意一层被截断。

一个触摸事件也可能会触发多个listener(e.g.click,longclick)这主要得益于内部实现机制:当鼠标抬起时触发click,当鼠标按下后延时一段时间触发longclick,抬起后如果监测到longclick还没有执行,则删除longclick事件,实现这两个listener不同时执行。

动画

帧动画

  • 作用于ImageView、TesxtView等,一帧一帧展示,原理和gif相同,不可以用来更改view的属性(宽度、高度等)
  • 可以用于loading动画

补间动画

  • 中间过程由系统生成(插值器)
  • 实现若干动作类型或者叠加:透明、旋转、缩放、平移
  • 可以用于转场动画
  • 可以调整插值器(或者自定义):调整速度等
  • 同样只能作用于view,不能改变属性

属性动画

  • 作用于java对象
  • 将不断改变的值赋给属性,实现属性本身的动态变化
  • 更为强大,可以实现更为复杂的动画

自定义ui

  1. 继承view,实现checkable,实现四种构造器
  2. 处理布局
  3. 动画
  4. 交互