美文网首页
Android中requestLayout、invalidate

Android中requestLayout、invalidate

作者: AndroidTony | 来源:发表于2017-12-14 17:41 被阅读43次

    0 概述

    我们知道,Android中View的绘制,需要由顶层ViewGroup开始,依次执行measure、layout以及draw的过程。当程序员需要刷新界面时,常用的有requestLayout、invalidate以及postInvalidate这几个方法。
    我们先看一下View绘制流程,便于后续理解:http://www.jianshu.com/p/373293385cc4
    下面讲述一下这几个方法的不同:

    image.png

    1 requestLayout流程

    image.png

    requestLayout的时候,会根据责任链模式,将事件向上传递给ViewRootImpl,最终调用View
    RootImpl的requestLayout方法,开启一轮新的measure、layout以及draw的过程。

    2 invalidate流程

    image.png

    invalidate是失效的意思,该函数在主线程调用,同样会走到ViewRootImpl的performTraversals当中,但是由于标志位的不同,不会像requestLayout一样,而是只进行draw过程。

    3 postInvalidate

    这个方法是在子线程调用,通过Handler发送异步消息到主线程,最终还是会走到invalidate当中。

    4 总结

    一般来说,如果View确定自身不再适合当前区域,比如说它的LayoutParams发生了改变,需要父布局对其进行重新测量、布局、绘制这三个流程,往往使用requestLayout。而invalidate则是刷新当前View,使当前View进行重绘,不会进行测量、布局流程,因此如果View只需要重绘而不需要测量,布局的时候,使用invalidate方法往往比requestLayout方法更高效。

    相关文章

      网友评论

          本文标题:Android中requestLayout、invalidate

          本文链接:https://www.haomeiwen.com/subject/mxskixtx.html