`
iaiai
  • 浏览: 2204600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

view组件draw,onDraw,dispatchDraw

 
阅读更多
Android的view组件显示主要经过mesure, layout和draw这三个过程。在mesure阶段里调用mesure(int widthSpec, int heightSpec)方法,这个方法是final不能被重写,在这个过程里会调用onMesure(int widthSpec, int heightSpec)方法。当组件设置好大小后,调用final layout(int l, int t, int r, int b)方法进行布局,在这个过程里会调用onLayout(boolean changed, int l, int t, int r, int b)方法,所以处理组件的布局通常要重写onMesure和onLayout这两个方法。

    View组件的绘制会调用draw(Canvas canvas)方法,这个方法在源代码里看不到在哪里调用...draw过程中主要是先画Drawable背景,对drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小,不过俺没有在源代码里找到布局时调用过 getIntrinsicWidth()和getIntrinsicHeight()方法...

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

相关推荐

    自定义View和viewGroup

    3. 绘制(Draw):View的绘制过程是通过onDraw方法来实现的。在这个方法中,View会根据自己的状态和样式来绘制自己。 ViewGroup的工作原理 ------------- ViewGroup的工作原理与View类似,也可以分为三步:测量、...

    Adroid UI 界面绘制原理分析

    * dispatchDraw():ViewGroup 的 dispatchDraw 函数,会根据子 View 的私有标志位 mPrivateFlags 来调用子类的 draw() 或者 dispatchDraw(canvas)。 掌握 Android UI 界面绘制原理可以帮助开发者更好地理解 Android...

    Android View 绘制流程(Draw)全面解析

    4. **dispatchDraw()**:对子View进行绘制,通常由 ViewGroup 调用,遍历并绘制所有的子View。 5. **postInvalidate() / invalidate()**:标记View需要重绘,触发绘制流程。 6. **硬件加速**:如果开启硬件加速,...

    android view绘图机制.doc

    `draw()`方法内部包含了绘制背景、渐变框、视图本身(通过`onDraw()`)、子视图(`dispatchDraw()`)和滚动条等步骤。`onDraw()`是子类必须覆写的方法,以实现自定义的视图绘制,例如TextView在这里绘制文本。`...

    安卓Android源码——draw1.rar

    从根ViewGroup开始,递归调用`dispatchDraw()`,最终到达每个子View的`onDraw()`。 7. **测量与布局**:在绘制之前,View需要先进行测量和布局。`onMeasure()`方法确定View的大小,`onLayout()`方法确定View的位置...

    Android中的View与ViewGroup绘制过程,手势监听顺序与使用

    3. **dispatchDraw()**:遍历子View,调用他们的draw()方法进行绘制。 接下来,我们讨论手势监听。在Android中,手势识别主要通过MotionEvent类来实现,它包含了触摸事件的各种状态,如ACTION_DOWN、ACTION_UP等。...

    android ICS 动画原理与实现分析

    4. 绘制子View:通过`dispatchDraw`方法递归地绘制子View,确保整个View树中的内容都能被绘制出来。 5. 淡入淡出:在适当的地方绘制淡入淡出效果,并恢复画布的层。 6. 绘制修饰内容:如滚动条等,这也可以在自定义...

    Android绘图原理

    - 在`draw()`方法中,View会调用`background.draw()`、`onDraw()`、`dispatchDraw()`和`onDrawScrollBars()`等方法来完成具体绘制。 - `dispatchDraw()`在ViewGroup中特别关键,它会递归地调用所有子View的`draw()...

    Adroid UI 界面绘制原理分析.zip

    `View`还可以重写`dispatchDraw()`来绘制子`View`。 7. **触摸事件处理**:Android UI还涉及到触摸事件的传递和处理,事件沿着视图层次结构向下传递,从父`ViewGroup`到子`View`,直到被消费。 8. **性能优化**:...

    Android 自定义控件

    Android的视图系统采用组合模式,所有的图形界面组件都继承自View类,而ViewGroup则作为视图容器类,用于管理多个View。View的核心操作包括measure、layout和draw三个阶段: 1. **measure**阶段:计算视图的大小。`...

    DrawProcessOfView:View绘制流程详解

    - `dispatchDraw()`: 用于处理子View的绘制,递归调用它们的`onDraw()`方法。 在绘制流程中,Android使用了硬件加速机制,当满足条件时,会启用硬件加速,以提高UI的渲染性能。此外,`ViewRootImpl`是整个绘制流程...

    Android 自定义控件详解及实例代码

    3. `draw()`:绘制View。`onDraw()`方法是最重要的,它负责绘制View的内容。对于ViewGroup,它会调用`dispatchDraw()`来绘制子视图。 自定义View通常需要至少重写`onMeasure()`和`onDraw()`方法。在`onDraw()`中,...

    android 动画

    在`View`的`draw`方法中,首先绘制背景,然后可能保存画布以备后续的淡入淡出效果,接着调用`onDraw`方法绘制视图内容,再绘制子视图,最后处理淡入淡出和额外的装饰内容(如滚动条)。 在`onDraw`方法中,开发者...

    基于Android平台的软件开发若干关键技术分析.pdf

    绘制(draw)阶段,通过dispatchDraw()方法调用背景View进行绘制,同时利用canvas.saveLayer()保存Layer画布,实现数据的调用,从而完成图表的绘制。 其次,Android提供了多种数据存储技术,包括SharedPreferences...

    试论Android平台下软件开发的关键技术.pdf

    接着,通过`draw()`和`dispatchDraw()`等方法,绘制Layer图层的画布,从而完成数据的调用和显示。这个过程虽然看似复杂,但对于提供给用户完美的视觉效果至关重要。 其次,数据存储是Android应用程序功能实现的基础...

    Android ShimmerLayout实现微光效果解析

    在自定义View的`onDraw()`方法中,首先调用`super.dispatchDraw(canvas)`来绘制视图的基本内容。然后,使用PorterDuff.MODE.SRC_IN,我们将之前创建的微光Bitmap绘制到canvas上,从而实现两者之间的混合。 ```java ...

Global site tag (gtag.js) - Google Analytics