自定义View之draw()与onDraw()方法

draw()方法

下面是View的draw()方法的注释部分:

/*
* Draw traversal performs several drawing steps which must be executed
* in the appropriate order:
*
*      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)
*/

第二步和第五步很少用到。总结一下的话,draw()方法做了这些事情:
(1)绘制背景。由private方法drawBackground()完成。如果未设定背景Drawable对象,则会直接返回。
(2)绘制内容。由onDraw()方法完成。
(3)绘制子视图。由dispatchView()完成。View的dispatchView()是空方法,ViewGroup的dispatchView()有具体实现,主要是调用子视图的draw()方法。
(4)绘制装饰。主要是foreground与滚动条。
因此,只要最高层的根布局调用了它的draw()方法,低层的所有view的draw()方法最终都会被调用。因此,大部分情况下draw()方法是不需要手动调用的,我们只需要覆盖onDraw()方法,将自己的内容绘制出来即可。

onDraw()方法

//View中的onDraw()方法
protected void onDraw(Canvas canvas) {
}

毫无疑问的,View的onDraw()方法是个空方法。基本上所有的自定义view都需要实现这个方法,否则无法显示任何内容。编程人员需要做的,就是利用Canvas类提供的各种方法,将内容绘制到正确的位置上。

invalidate()、postInvalidate()以及postInvalidateDelayed()

如果view的内容变化了,需要对其进行重绘。通过调用invalidate(),postInvalidate(),postInvalidateDelayed()这三个方法,最终都会进入onDraw()方法中。下面看看这三个方法的区别:

invalidate()

立即进行重绘。这个方法只能在UI线程中调用。

postInvalidate()

立即进行重绘。这个方法可以在非UI线程中调用。

postInvalidateDelayed(long delayMilliseconds)

延迟重绘。这个方法接受一个毫秒值,重绘会在经过了这么一段时间后进行。这个方法可以在非UI线程中调用。
补充一点:这三个方法都有一个重载版本,接受(int l, int t, int r, int b)这么一组参数。这组参数确定了一块“脏区域”,重绘只会在这块区域上进行。如果不提供的话,会默认重绘整块区域。

小技巧

如果想要实现每隔若干秒自动重绘一次要怎么做呢?很简单,在onDraw()中调用postInvalidateDelayed(delayMilliseconds)即可。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值