1.Android 14 HWUI 源码研究 View Canvas RenderThread ViewRootImpl skia
2.Android自定义控件进阶-Canvas之绘制图形
3.å¦ä½ç¨android ç»åºä¸è§å½¢
Android 14 HWUI 源码研究 View Canvas RenderThread ViewRootImpl skia
HUWUI是Android系统中负责应用可视化元素绘制的核心组件,其架构主要在C++层实现,从Java层接收View绘制信息,通过唯一的渲染线程使用skia技术完成渲染任务。整体上,从应用程序到UI线程,quill 源码模式再到渲染线程,形成了清晰的层级关系。
HUWUI的构建主要包括三个核心类,它们分别是:RecordingCanvas、Canvas、RenderNode、读mybatis源码RenderProxy、RenderThread、CanvasContext、IRenderPipeline。在Java层,主要涉及两类Canvas,RecordingCanvas用于记录绘制指令,Canvas则是直接用于渲染。RecordingCanvas在构造时创建,而Canvas在调用时创建。这两个类在C++层分别对应SkiaRecordingCanvas和SkiaCanvas,源码解析net后者直接引用SkCanvas。
在全局循环中,UI线程与渲染线程之间的协同操作至关重要。具体流程包括:新创建Activity后,附着到对应的PhoneWindow,然后调用PhoneWindow的setContentView方法,将View添加到DecorView作为子节点。接着,DecorView与ViewRootImpl对接,完成View的更新与渲染。整个过程包含了measure、图片合并源码layout和draw等复杂子流程。
渲染线程创建与核心对象紧密关联,主要包括RenderProxy、RenderThread和DrawFrameTask。RenderProxy负责Java层信息的衔接,RenderThread作为进程唯一的渲染线程,持有DrawFrameTask和CanvasContext,完成一帧的绘制任务。指令记录流程的核心在于使用C++层的RecordingCanvas将View属性和绘制信息记录到DisplayList中,进而完成指令的渲染。
Surface、源码加补码ANativeWindow、EGLSurface的创建流程在ViewRootImpl的performTraversals函数中初始化。ReliableSurface的封装和EGL与Skia环境的创建主要在RenderThread的requireGlContext函数中实现。从源码分析,这一过程通常在三个地方调用。
View树与RenderNode树之间的协作关系明确,一个Application进程对应多个Activity,每个Activity与一个PhoneWindow绑定,PhoneWindow持有DecorView,DecorView对应一个ViewRootImpl,而ViewRootImpl与ThreadedRender模块对接。ThreadedRender与C++层的RenderProxy一一对应,RenderProxy持有关键对象,如RenderThread、CanvasContext、DrawFrameTask等。RenderThread是单例模式,进程唯一,负责一帧绘制的逻辑。
在RenderPipeline模块中,关键操作包括makeCurrent、draw和swapBuffers。Native Canvas在这一过程中扮演了桥梁角色,接收Java API调用,而RecordingCanvas完成Op记录,最终DisplayListData存储这些Op。
skia的核心资源主要在三个使用场景中发挥作用,具体细节需深入分析,这些资源对于实现高效、稳定的渲染效果至关重要。
Android自定义控件进阶-Canvas之绘制图形
Canvas简介
Canvas,即画布,是Android平台用于绘制2D图形的基础,功能强大,可以绘制各种图形和内容。
Canvas操作速查表
常用方法已列在表格中,更多详细信息请参考官方文档。
Canvas详解
本篇将讲解如何使用Canvas绘制基本图形。
绘制颜色
用于填充整个画布或绘制底色。
创建画笔
绘制内容前需先创建画笔。
绘制点
可以绘制单点或多点。
绘制直线
需要提供两个点,可绘制单条或多条直线。
绘制矩形
使用四个数值或封装为Rect或RectF确定矩形位置。
绘制圆角矩形
提供了两种方法,参数包括矩形位置和圆角半径。
绘制椭圆
使用矩形参数确定椭圆。
绘制圆
使用圆心坐标和半径参数。
绘制圆弧
需要角度起始位置和扫过角度,可使用中心点进行绘制。
Paint简要介绍
画笔用于设置颜色、样式等绘制参数。
示例简要介绍
展示如何使用Canvas制作饼状图。
自定义View
流程梳理,代码示例,包括数据封装和界面重绘。
饼状图示例
代码简单,主要关注制作思路。
更多资源
提供Android相关知识链接,涵盖性能调优、车载学习、框架核心知识点、八大知识体系和面试题。
å¦ä½ç¨android ç»åºä¸è§å½¢
1ã设置Viewï¼éåprotected void onDraw(Canvas canvas)æ¹æ³
2ã使ç¨onDrawä¸çcanvasï¼éè¿Path设置ä¸è§å½¢çä¸ä¸ªé¡¶ç¹ï¼éè¿drawPathæ¹å¼ç»å¶ä¸è§å½¢
示ä¾ï¼
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("ç»ä¸è§å½¢ï¼", , , p);
// ç»å¶è¿ä¸ªä¸è§å½¢,ä½ å¯ä»¥ç»å¶ä»»æå¤è¾¹å½¢
Path path = new Path();
path.moveTo(, );// æ¤ç¹ä¸ºå¤è¾¹å½¢çèµ·ç¹
path.lineTo(, );
path.lineTo(, );
path.close(); // 使è¿äºç¹ææå°éçå¤è¾¹å½¢
canvas.drawPath(path, p);
}