View onDraw、dispatchDraw、invalidate和computeScroll介绍

结合View.Java的源码,在draw方法中:

public void draw(Canvas canvas) {

/* View的绘制过程分为下面几步:

  1. Draw the background 绘制背景

  2. If necessary, save the canvas’ layers to prepare for fading 如有必要,颜色渐变淡之前保存画布层(即锁定原有的画布内容)

  3. Draw view’s content 绘制View的内容

  4. Draw children 绘制子View

  5. If necessary, draw the fading edges and restore layers 如有必要,绘制颜色渐变淡的边框,并恢复画布(即画布改变的内容附加到原有内容上)

  6. Draw decorations (scrollbars for instance) 绘制装饰,比如滚动条

*/

// Step 1, draw the background, if needed

if (!dirtyOpaque) { 
drawBackground(canvas); //画背景 
}

// skip step 2 & 5 if possible (common case) 
final int viewFlags = mViewFlags; 
boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; 
boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; 
if (!verticalEdges && !horizontalEdges) { 
// Step 3, draw the content 
if (!dirtyOpaque) onDraw(canvas);

// Step 4, draw the children
dispatchDraw(canvas);

// Step 6, draw decorations (scrollbars)
onDrawScrollBars(canvas);

if (mOverlay != null && !mOverlay.isEmpty()) {
    mOverlay.getOverlayView().dispatchDraw(canvas);
}

// we're done...
return;

}

protected void dispatchDraw(Canvas canvas) {} //空实现

protected void onDraw(Canvas canvas) {} //空实现

}

ViewGroup中:

protected void dispatchDraw(Canvas canvas) {

...

drawChild(...); //绘制子view

...

}

protected boolean drawChild(Canvas canvas, View child, long drawingTime) {

    return child.draw(canvas, this, drawingTime);

}

说明:

  1. 自定义一个View时,重写onDraw会绘制View。

    调用View.invalidate(),会触发onDraw和computeScroll()(前提是该view被附加在当前窗口上)。

    View.postInvalidate(); //UI线程调用invalidate,非UI线程调用postInvalidate

  2. 自定义一个ViewGroup,重写onDraw。

    onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。

    表示这个ViewGroup有东西需要绘制了,才会触发draw方法,之后是onDraw方法。

    因此,一般直接重写dispatchDraw来绘制ViewGroup

  3. 自定义一个ViewGroup

    dispatchDraw会调用drawChild。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值