尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Adroid UI 界面绘制原理分析

Adroid UI 界面绘制原理分析 Adroid 界面绘制实现View类包含Surface变量名mSurface。Surface中包含CompatibleCanvas变量名mCanvas。CompatibleCanvas继承至Canvaljava.awt.Canval其中包含一个矩阵对象Matrix变量名mOrigMatrix。矩阵Matrix就是一块内存区域针对View的各种绘画操作都保存在此内存中。每个Surface通常对应两个buffer一个front buffer, 一个back buffer。其中back buffer就是canvas绘图时对应的bitmap (研究android_view_Surface.cpp::lockCanvas)。因此绘画总是在back buffer上需要更新时则将back buffer和front buffer互换。每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成composite绘制到屏幕上。用户接口方面主要表现任务由View的各种继承类来实现。View类的继承关系如图所示。当用户请求绘制调用invalidate()此函数会找到当前View或Viewgroup的ParentView,并调用父视图的invalidateChild(this, r)。invalidateChild会循环调用父视图的invalidateChildInParent()因此层层向上层视图调用直到调用到根视图ViewRoot。ViewRoot的invalidateChildInParent调用invalidateChild然后发送消息让ViewRoot进行绘制。绘制代码在handleMessage()中的case DO_TRAVERSAL中调用了performTraversals()。然后调用下一级视图的draw()函数。draw函数会依次调用以下几个函数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传递给本地层进行显示。参考别人的分析自己大概的看了一遍。框架层看得差不多了本地层还没有看。等有时间看了再更新吧。
返回列表