invalidate和requestLayout方法源码分析

Posted 白乾涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了invalidate和requestLayout方法源码分析相关的知识,希望对你有一定的参考价值。

invalidate方法源码分析

在之前分析View的绘制流程中,最后都有调用一个叫invalidate的方法,这个方法是啥玩意?我们来看一下View类中invalidate系列方法的源码(ViewGroup没有重写这些方法),如下:
  1. /**
  2.  * Mark the area defined by dirty as needing to be drawn. dirty代表需要重新绘制的脏的区域
  3.  * If the view is visible, onDraw(Canvas) will be called at some point in the future.
  4.  * This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().
  5.  * <b>WARNING:</b> In API 19 and below, this method may be destructive to dirty.
  6.  * @param dirty the rectangle矩形 representing表示 the bounds of the dirty region地区
  7.  */
  8. public void invalidate(Rect dirty) {
  9. final int scrollX = mScrollX;
  10. final int scrollY = mScrollY;
  11. invalidateInternal(dirty.left - scrollX, dirty.top - scrollY,
  12. dirty.right - scrollX, dirty.bottom - scrollY, true, false);
  13. }
  14. public void invalidate(int l, int t, int r, int b) {
  15. final int scrollX = mScrollX;
  16. final int scrollY = mScrollY;
  17. //实质还是调用invalidateInternal方法
  18. invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
  19. }
  20. /**
  21.  * Invalidate the whole view. 重新绘制整个View
  22.  */
  23. public void invalidate() {
  24. invalidate(true);
  25. }
  26. public void invalidate(boolean invalidateCache) {
  27. invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true);
  28. }
  29. //这是所有invalidate的终极调用方法
  30. void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache, boolean fullInvalidate) {
  31. ......
  32. // Propagate繁殖、传播 the damage损害的(只需要刷新的) rectangle to the parent view.
  33. final AttachInfo ai = mAttachInfo;
  34. final ViewParent p = mParent;
  35. if (p != null && ai != null && l < r && t < b) {
  36. final Rect damage = ai.mTmpInvalRect;
  37. damage.set(l, t, r, b);//将需要刷新的区域封装到damage中
  38. p.invalidateChild(this, damage);//调用Parent的invalidateChild方法,传递damage给Parent
  39. }
  40. ......
  41. }
由此可知,View的invalidate
方法实质是将要刷新区域直接传递给了【父ViewGroup的invalidateChild方法,这是一个从当前View向上级父View回溯的过程 。

我们看下ViewGroup的invalidateChild方法: