invalidate源码分析

调用invalidate方法,最终会调用自己的onDraw方法进行重绘

调用invalidate会调用view的invalidate

  • 首先判断视图是否有效
  • 然后再继续判断是否跳过重绘
  • 最终会调用父类的invalidateChild(this, damage); 方法

关键方法

p.invalidateChild(this, damage);

就调用viewGroup的invalidateChild方法

不断调用

do {
                parent = parent.invalidateChildInParent(location, dirty);
                if (view != null) {
                    // Account for transform on current parent
                    Matrix m = view.getMatrix();
                    if (!m.isIdentity()) {
                        RectF boundingRect = attachInfo.mTmpTransformRect;
                        boundingRect.set(dirty);
                        m.mapRect(boundingRect);
                        dirty.set((int) Math.floor(boundingRect.left),
                                (int) Math.floor(boundingRect.top),
                                (int) Math.ceil(boundingRect.right),
                                (int) Math.ceil(boundingRect.bottom));
                    }
                }
            } while (parent != null);

不断的do while循环,直到循环到最外层view的invalidateChildInParent方法。
里面的parent是调用的ViewGroup的invalidateChildInParent方法
最外层是调用ViewRootImpl的invalidateChildInParent方法

ViewRootImpl类中invalidateChildInParent方法分析


invalidateChildInParent -> invalidateRectOnScreen -> scheduleTraversals -> postCallback/mTraversalRunnable -> doTraversal -> performTraversals


==在View的绘制流程中performTraversals方法是非常重要的==

  • [ ] 测量

performMeasure

  • [ ] 摆放

performLayout

  • [ ] 绘制

performDraw

最后调用

mView.draw(canvas);

==mView是最外面的view,不是调用invalidate方法的那个view,
又调到view的ondraw中,有有了view的绘制流程==

invalidate流程

==一路往上跑,跑到顶层视图(最外层)调用draw方法,draw里面有dispatchDraw绘制children,一路往下画,最终画到当前调用invalidate方法的view的ondraw方法。==

invalidate是牵连着整个layout布局中的所有view

你可能感兴趣的:(invalidate源码分析)