Android UI界面绘制原理与实现.pdfVIP

  • 0
  • 0
  • 约2.07千字
  • 约 6页
  • 2026-01-26 发布于北京
  • 举报

Adroid界面绘制实现

View类包含Surface(变量名mSurface)。Surface中包含CompatibleCanvas(变量名

mCanvas)。CompatibleCanvas继承自Canvas(java.awt.Canvas),其中包含一个矩阵对

象Matrix(变量名mOrigMatrix)。矩阵Matrix就是一块内存区域,针对View的各种绘图

操作都保存在这块内存中。

每个Surface通常对应两个buffer,一个frontbuffer,一个backbuffer。其中,back

__

buffer就是canvas绘图时对应的bitmap(研究androidviewSurface.cpp::lockCanvas)。因

此,绘画总是在backbuffer上,需要更新时,则将backbuffer和frontbuffer互换。

每个surface又对应一个layer,SurfaceFlinger负责将各个layer的frontbuffer合成

(composite)绘制到屏幕上。

用用户接口方面,主要表现任务由View的各种继承类来实现。View类的继承关系如图所示。

界面绘制实现

类包含(变量名)。中包含(变量名)。

继承至(),其中包含一个矩阵对象(变量名

)。矩阵就是一块内存区域,针对的各种绘画操作都保存在此内存

中。

每个通常对应两个,一个一个。其中,就

是绘图时对应的研究。因此,绘画总

是在上,需要更新时,则将和互换。

每个又对应一个负责将各个的合成()

绘制到屏幕上。

用户接口方面,主要表现任务由的各种继承类来实现。类的继承关系如图所示。

当用户请求绘制调用invalidate(),此函数会找到当前View或ViewGroup的ParentView,并

调用父视图的invalidateChild(this,r)。invalidateChild会循环调用父视图的

invalidateChildInParent(),因此层层向上层视图调用,直到调用到根视图ViewRoot。

ViewRoot的invalidateChildInParent调用invalidateChild,然后发送消息让ViewRoot进行绘

制。绘制代码在handleMessage()中的caseDOTRAVERSAL中调用了performTraversals()。

然后调用下一级视图的函数。函数会依次调用以下几个函数:

background.draw(canvas)

onDraw(canvas)

dispatchDraw(canvas)

onDrawScrollBars(canvas)

在ViewGroup的dispatchDraw中会调用drawChild函数。drawChild根据子View的私

有标志位mPrivateFlags来调用子类的draw()或者dispatchDraw(canvas)。由此实现了

层层向下绘制,直到最基本的View。View的dispatchDraw是一个抽象函数,绘制过程

到此结束。最后ViewRoot会调用nativeShowFPS(canvas,nowͲsDrawTime)函数将绘制

结果canvas传递给本地层进行显示。

参考别人的分析,自己大概地看了一遍。框架层看得差不多了,本地层还没有看。等有时间看

了再更新吧。

ZĂĚŝŽƌŽƵƉdĂďtŝĚŐĞƚ

Žƌ

当用户请求绘制调用,此函数会找到当前或的并调

用父视图的。会循环调用父视图的

因此层层向上层视图调用,直到调用到根视图。的

调用,然后发送消息让进行绘制。绘制代码在中的

中调用了。

然后调用下一级视图的函数。函数会依次调用以下几个函数:

在的中会调用函数。根据子的私有标志

位来调用子类的或者。由此实现了层层向下绘制,

直到最基本的。的是一个抽象函数,绘制过程到此结束。最后

会调用Ͳ函数将绘制结果传递给本地

层进行显示。

参考别人的分析,自己大

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档