最近做了一个关于用户雷达图的需求,有用到关于ui绘制相关的东西,于是去了解了下关于invalidate() 、postInvalidate()、requestLayout() 的知识。
invalidate
该方法会请求重绘view树,即draw(),刷新UI,并且不会调用onMeasure(),谁调用重绘谁,ViewGroup则重绘整个ViewGroup.
一般会触发invalidate的主要为如下几种方式:
- 直接调用invalidate:请求重新draw(),但只会绘制调用者本身
- setSelection()方法:请求重新draw(),但只会绘制调用者本身
- setVisibility()方法:当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法,继而绘制该View
- setEnabled()方法:请求重新draw(),但不会重新绘制任何视图包括该调用者本身
postInvalidate
与invalidate()方法区别就是,postInvalidate()方法可以在UI线程执行,也可以在工作线程执行而invalidate()只能在UI线程操作。
但是从重绘速率讲:invalidate()效率高。
requestLayout
这个方法与invalidate()相反,他只调用measure()和layout()过程,不会调用draw(),不会重新绘制任何视图包括该调用者本身。
requestFocus
requestFocus()方法,他只刷新你要刷新的地方,即让某一部分获取焦点,获取焦点的会导致view的重绘。