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方法更高效。

更多相关文章

  1. 1.android开发AsyncTask异步发送HTTP请求 2.接口与抽象类
  2. 使用ViewPager实现android软件使用向导的功能
  3. Android中使用WindowManager在界面布局上添加浮动窗口
  4. [原创]HierarchyView的实现原理和Android设备无法使用HierarchyV
  5. [android] Bundle savedInstanceState的作用
  6. BAT大咖助力 全面升级Android面试-3android基础相关面试题
  7. LiveData+ViewModel+Lifecycle
  8. 第四讲 布局【线性+相对】&常用控件(view)
  9. Nexus S不能发短信的解决方法

随机推荐

  1. Android快速调试方法
  2. Android开发应用记录
  3. Android开发---从简单的TextView看Androi
  4. [转载]Android布局文件中命名空间的解析
  5. Android Binder之native层解析
  6. Android关于socket编程,实现与服务器端通
  7. Android OpenSL介绍 并实现播放PCM功能
  8. Android学习问题:关于AlertDialog中自定义
  9. 由安装Busybox到Android过程中想到的
  10. Android Studio如何设置自己主动提示代码