这是我参与「第四届青训营」笔记创作活动的第十二天。这篇笔记主要是对安卓客户端常规&高级UI编程”这节课中渲染和交互布局相关部分的记录。
笔记
渲染
布局加载
编写布局文件->注册Manifest->设置布局文件
页面绘制起点
-
onCreate():setContentView()创建了DecorView,并将layout中的View添加至DecorView中 -
onResume():ActivityThread.handleResumeActivity()
-
WindowManagerImpl.addView
-
创建ViewRootImpl
-
ViewRootImpl.setView
-
ViewRootImpl.requestLayout(),触发页面绘制
View绘制流程
performMeasure -> measure -> onMeasure -> Measure
performLayout -> layout -> onLayout -> Layout
performDraw -> draw -> onDraw -> Draw
页面绘制流程
WindowManageImpl -> addView() -> WindowManagerGlobal -> addView() -> ViewRootlmpl -> setView() -> requestLayout() -> scheduleTraversals() ->Choreographer -> postCallback() -> TraversalRunnable -> doTraversal() ->performTraversals() -> performMeasure() -> performLayout() -> performDraw() -> WindowManagerService -> addWindow() 将Window添加到屏幕上
Vsync信号
- Vsync: 帧同步信号,表示扫描1帧的开始。
UI渲染
Choreographer Vsync
UI Thread
input(输入处理),Animation(动画),measure(测量),layout(布局),draw(绘制),sync(同步) —— CPU
RenderThread
sync(同步),execute(执行),get buffer(获取缓存区),issue(命令问题),swap buffer(交换缓冲区) —— GPU
Graphics get buffer(获取缓存区),swap buffer(交换缓冲区),composite(合成) —— SurfaceFlinger/HWC
交互
常见交互事件监听器
onClick(): View.OnClickListener
当用户轻触项目(在触摸模式下),或者使用导航键或轨迹球聚焦于项目,然后按适用的Enter键或按下轨迹球时,系统会调用此方法。
onLongClick(): View.OnLongClickListener
当用户轻触并按住项目(在触摸模式下)时,或者使用导航键或轨迹球聚焦于项目,然后按住适用的Enter键或按住轨迹球(持续一秒钟)时,系统会调用此方法。
onFocusChange(): View.OnFocusChangeListener
当用户使用导航键或轨迹球转到或离开项目时,系统会调用此方法。
onKey(): View.OnFocusChangeListener
当用户聚焦于项目并按下或释放设备上的硬件按键时,系统会调用此方法。
onTouch(): View.OnTouchListener
当用户执行可视为触摸事件的操作时,包括按下、释放或屏幕上的任何移动手势(在项目边界内),系统会调用此方法。
屏幕触摸事件
所有的交互事件都来自于对屏幕触摸信号的处理,View.OnClickListener()等常用点击事件是对交互事件的二次封装
触摸事件MotionEvent
ACTION_DOWN
- 当手指接触屏幕时产生此事件,它表示一个触屏事件序列的开始
- 在多点触摸时,只有第一个手指接触屏幕时才会产生此事件
ACTION_UP
- 当手指离开屏幕时产生此事件,它表示一个触屏事件序列的结束
- 在多点触摸时,只有最后一个手指离开屏幕时才会产生此事件
ACTION_MOVE
- 当手指在屏幕上滑动时产生此事件
- 在多点触摸时,每一个手指的滑动都会产生此事件
ACTION_CANCEL
- 当一个事件序列须要提早终止的时候由系统自动产生此事件
ACTION_POINTER_DOWN
- 只有在多点触摸时才会产生此事件
- 在一个触屏事件序列中,除第一个接触屏幕的手指外,其余手指接触屏幕时会产生此事件
ACTION_POINTER_UP
- 只有在多点触摸时才会产生此事件
- 在一个触屏事件序列中,除最后一个离开屏幕的手指外,其余手指离开屏幕时会产生此事件
当用户触摸屏幕时,系统将建立一系列的MotionEvent对象,MotionEventt包含关于发生触摸的位置和时间等细节信息,MotionEvent对象被传递到相应的捕获函数中,例如onTouchEvent()。
总结
通过本次课的学习,我了解到了安卓客户端UI渲染与交互的知识,这是呈现精美的画面以及与用户互动的基础。