Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Android Invalidate() And RequestLayout() #52

Open
yunshuipiao opened this issue May 28, 2019 · 0 comments
Open

Android Invalidate() And RequestLayout() #52

yunshuipiao opened this issue May 28, 2019 · 0 comments
Labels

Comments

@yunshuipiao
Copy link
Owner

Android Invalidate() And RequestLayout()

这篇文章探讨能够触发 performTraversals() 执行的 invalidata(), requestLayout() 方法的流程。

在调用这几个方法到最后执行 performTravelsals() 方法,涉及到通过 Choroegrapher 请求 VSYNC 信号,实现按帧绘制的流程。

requestLayout

invalidate() 和 postInvalidate() 都能够触发 View 的重画,这两个方法最终会调用 performTraversals() 中的performDraw() 来完成重绘制,是否执行 onMeasure 和 onLayout 需要通过标志位来决定;

requestLayout() 方法也会调用 performTraversals() 方法,但是只会执行measure 和 layout 流程,不会调用 draw 流程来触发重画动作。

invalidate()与postInvalidate()流程 

invalidate()与postInvalidate()都是用于被调用来触发View的更新(重画)动作,区别在于invalidate()方法是在UI线程自身中使用,而postInvalidate()是非UI线程中使用。 首先来看View.postInvalidate()。

Choreographer类分析

编舞类”Choreoprapher的作用是编排输入事件、动画事件和绘制事件的执行,通过调用Choreoprapher.postCallback()方法,向Choreoprapher加入需要编排的事件,而Choreoprapher则通过请求Vsync信号,来控制这些事件按照屏幕刷新周期有规律的执行,即是实现了按帧绘制的机制。

  在ViewRootImpl中,会调用mChoreographer = Choreographer.getInstance()来初始化一个Choreographer变量。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant