View绘制流程

invalidate源码分析

2017-08-09  本文已影响71人  Seven鑫洋

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

调用invalidate会调用view的invalidate

关键方法

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

上一篇 下一篇

猜你喜欢

热点阅读