Android客户端UI渲染与交互笔记|青训营笔记

222 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的第十二天。这篇笔记主要是对安卓客户端常规&高级UI编程”这节课中渲染和交互布局相关部分的记录。


笔记

渲染

布局加载

编写布局文件->注册Manifest->设置布局文件

页面绘制起点

  • onCreate():setContentView()创建了DecorView,并将layout中的View添加至DecorView中

  • onResume():ActivityThread.handleResumeActivity()

  1. WindowManagerImpl.addView

  2. 创建ViewRootImpl

  3. ViewRootImpl.setView

  4. 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渲染与交互的知识,这是呈现精美的画面以及与用户互动的基础。