View中的draw和onDraw的区别

转载 2015年07月07日 22:06:26

1.大概扫一下源码就可以明白,draw()这个函数本身会做很多事情,
         *      1. Draw the background
         *      2. If necessary, save the canvas' layers to prepare for fading
         *      3. Draw view's content
         *      4. Draw children
         *      5. If necessary, draw the fading edges and restore layers
         *      6. Draw decorations (scrollbars for instance)
在第三步的时候,它就会调用onDraw()方法,来绘制view的内容。也就是draw会调用onDraw。

所以看需要,一般情况下,直接用onDraw绘制view的content就可以了,如果绘制多一点的内容,可以调用draw(),不过Android官方推荐用只用onDraw就可以了。“When implementing a view, do not override this method; instead, you should implement onDraw”



2.View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小,


          画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),

getIntrinsicHeight()方法,然后设为背景。


3.ondraw() 和dispatchdraw()的区别  

 绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现

   绘制自己的孩子通过dispatchDraw(canvas)实现


    View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小。


     画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),。

getIntrinsicHeight()方法,然后设为背景。


转自:http://blog.csdn.net/fener10289/article/details/8231712

View中的draw和onDraw,dispatchDraw的区别

Android的view组件显示主要经过mesure, layout和draw这三个过程。在mesure阶段里调用mesure(int widthSpec, int heightSpec)方法,这个方...
  • lbdreaming
  • lbdreaming
  • 2014年09月16日 17:34
  • 3141

9.view 作图过程,讲讲draw/onDraw和drawChild

9.view 绘制过程,讲讲draw/onDraw和drawChild 转载请标明出处:  http://blog.csdn.net/yujun411522/article/detai...
  • sd19871122
  • sd19871122
  • 2016年07月30日 16:33
  • 612

android自定义view三(draw和ondraw)

在上篇博客中介绍onMeasure(),onLayout()方法的和内部实现。1、draw()和onDraw()的区别1、draw()方法详解在自定义View的时候可以重写draw和onDraw()方...
  • androidxiaogang
  • androidxiaogang
  • 2016年07月13日 10:40
  • 3849

9.view 绘制过程,讲讲draw/onDraw和drawChild

转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46226135 本文出自:【yujun411522的博客】 ...
  • qq_27073205
  • qq_27073205
  • 2015年05月29日 20:20
  • 959

自定义View Draw过程- 最易懂的自定义View原理系列(4)

前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化 等 今天,我将全面总结自定义V...
  • carson_ho
  • carson_ho
  • 2017年02月20日 11:40
  • 9640

从源码角度分析view的draw过程

前面已经分析了Android view的测量和布局,并且重点介绍了linearLayout的测量机制。特别感谢博乐对我前一篇文章的推荐以及赞赏,我也会一如既往的写好每一篇文章。接下来的这篇文章会以前两...
  • andywuchuanlong
  • andywuchuanlong
  • 2015年08月21日 10:36
  • 1736

view.draw()以及调用invalidate()没有触发onDraw()

View中: public void draw(Canvas canvas) { /* 1. Draw the background   绘制背景 2. If ...
  • yizunda
  • yizunda
  • 2016年05月16日 11:18
  • 2778

View中的onDraw()方法的canvas的来由

在自定义控件中我们复写onDraw方法时,会获取到一个canvas对象,那么这个对象从哪里来的呢?下面跟踪一下部分源码,了解一下。 我们知道view被绘制,最终都是被ViewRootImpl调用的,...
  • yueye12
  • yueye12
  • 2017年07月21日 16:58
  • 269

Android 自定义View总结 —— onDraw

Android 自定义View onDraw解析,实现简单示例(画圆)
  • gucun4848
  • gucun4848
  • 2016年12月09日 17:31
  • 278

Android自定义View基础之onDraw详解

前文先后介绍了onMeasure和onLayout的流程,那么接下来就一起看一下onDraw方法吧。 Draw过程比较简单,主要作用是将View绘制到屏幕上面,先看一下draw方法的源码:/** ...
  • u010358168
  • u010358168
  • 2016年12月05日 20:28
  • 378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:View中的draw和onDraw的区别
举报原因:
原因补充:

(最多只允许输入30个字)