canvas教程

自定义view之view显示流程(8)

字号+ 作者:H5之家 来源:H5之家 2017-04-18 17:04 我要评论( )

看得出来很多工作是为绘制子view做准备的,包括准备cache、根据clip来设置canvas等,真正绘制的语句是more |= drawChild(canvas, child, drawingTime)这句,我们看下这个函数的源码。 /*** Draw one child of this

看得出来很多工作是为绘制子view做准备的,包括准备cache、根据clip来设置canvas等,真正绘制的语句是more |= drawChild(canvas, child, drawingTime)这句,我们看下这个函数的源码。

/** * Draw one child of this View Group. This method is responsible for getting * the canvas in the right state. This includes clipping, translating so * that the child's scrolled origin is at 0, 0, and applying any animation * transformations. * * @param canvas The canvas on which to draw the child * @param child Who to draw * @param drawingTime The time at which draw is occurring * @return True if an invalidate() was issued */ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { return child.draw(canvas, this, drawingTime); }

从注释中可以看到,这个方法不仅仅是为了绘制内容这么简单,我们对View应用的各种动画或者其他视觉效果也将在这里体现。它直接调用了子view的draw(),但显然这个draw函数和我们之前提到的不一样,现在这个三个参数。这个函数仍然是在View类中,由于源码太长,我就不贴了。注释中说明了,这个是专门让ViewGroup.drawChild()来调用的,子类不应该重写这个方法,也不应该在除了ViewGroup.drawChild()之外的其他地方调用它。看一下它的代码,会发现里面是一些对canvas进行位移、缩放和变形的代码,也验证了它确实是为View的动画效果准备的。并且在这里也调用了单参数版本的draw(Canvas canvas)来绘制内容。

具体各View怎么绘制的,就不详细看了,canvas本来就有绘制各种图像的方法,比如绘制椭圆、方形、文字、甚至还有绘制Drawable方法。在查看了TextView和ImageView的onDraw()方法后,发现在正式绘制前,都会把内容绘制到一个Drawable上,然后再将这个Drawable绘制到canvas上。

至于Canvas、Paint、Path、Drawable等等这些和图像相关的,可以具体去查一下,现学现用也可以。

总结

至此View的显示流程就讲解完毕了,也看到了一个View走过了measure、layout和draw这三大阶段需要多么复杂的工作,在此不得不感叹一句:现在的cpu真tm快啊~那么多view那么多流程,还能保证每秒60fps的帧率。有点跑题,总之详细内容在各部分也已经讲的很明白了。这里只做一个简单的总结。

measure

layout

draw
这个应该是流程最简单但是细节最复杂的一步了。具体的绘制需要用到Cavans、Drawable等,可以详细去查这方面的资料。总之一句话,内容都是绘制在传入的Canvas上,具体画什么怎么画,完全没有限制。

至此,View的显示的流程已经探索完了,接下来就是View的事件分发机制了,将会在我的下一篇博客《自定义view之view事件分发机制》中讲解。

声明:本系列文章部分知识点来自于《Android开发艺术探索》,在此对作者表示感谢。部分内容可能会有错误和遗漏,欢迎大家留言讨论。

Tags:android   界面   布局   自定义view   android  

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android开发基本常识及技巧

    Android开发基本常识及技巧

    2017-04-13 16:02

  • Android Canvas练习题(6)饼图(Pie Chart)百分比标注位置计算技巧

    Android Canvas练习题(6)饼图(Pie Chart)百分比标注位置计算技巧

    2017-04-12 11:00

  • Android Canvas clipPath 画图锯齿问题

    Android Canvas clipPath 画图锯齿问题

    2017-04-11 11:04

  • 实现Unity和Android进行交互

    实现Unity和Android进行交互

    2017-04-10 09:02

网友点评
n