<1>invalidate():View本身调用,迫使view重绘,需要在UI线程中自身调用。当View的appearance发生改变,比如状态改变(enable,focus),背景改变,隐显改变等,这些都属于appearance范畴,都会引起invalidate操作。所以当我们改变了View的appearance,需要更新界面显示,就可以直接调用invalidate方法。View(非容器类)调用invalidate方法只会重绘自身,ViewGroup调用则会重绘整个View树。调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。
<2>postInvalidate():实现view刷新,在非UI线程中调用。
<3>requestLayout():当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view(父类的视图)重新调用他的onMeasure、onLayout来重新设置自己位置。特别是当view的LayoutParameter发生改变,并且它的值还没能应用到view上时,这时候适合调用这个方法。 当View的边界,也可以理解为View的宽高,发生了变化,不再适合现在的区域,可以调用requestLayout方法重新对View布局。View执行requestLayout方法,会向上递归到顶级父View中,再执行这个顶级父View的requestLayout,所以其他View的onMeasure,onLayout也可能会被调用。
对比:
<1>invalidate和postInvalidate:invalidate方法只能用于UI线程中,在非UI线程中,可直接使用postInvalidate方法,这样就省去使用handler配合的代码
<2>invalidate和requestLayout
若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;
若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;
若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。(此处有待验证!!!)
From:http://blog.csdn.net/RichieZhu/article/details/52485331