重绘requestLayout() invalidate()和postInvalidate()

来源:互联网 发布:网络培训机构排名 编辑:程序博客网 时间:2024/05/29 19:13
Android中实现view的更新

重新绘制某个View,或绘制整个layout??

1.requestLayout()

  如果你希望视图的绘制流程可以完完整整地重新走一遍,就不能使用invalidate()方法,而应该调用requestLayout()了。
  当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view(父类的视图)重新调用他的onMeasure、onLayout来重新设置自己位置。特别是当view的layoutparameter发生改变,并且它的值还没能应用到view上时,这时候适合调用这个方法。
2.invalidate()
  UI线程自身中使用,利用invalidate()刷新界面,实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。invalidate()方法虽然最终会调用到performTraversals()方法中,但这时measure和layout流程是不会重新执行的,因为视图没有强制重新测量的标志位,而且大小也没有发生过变化,所以这时只有draw流程可以得到执行。
  Invalidate调用onDraw方法,requestLayout调用onMeasure和onLayout,不一定调用onDraw。

  invalidate:View本身调用迫使view重画。

  View的重绘,在Activity1中 使用invalidate()方法来重绘, 然后我跳到了Activity2这时候Activity1已经finash()掉 可是Activity1中 的invalidate() 的线程还在程序中,Android的虚拟机不可能主动杀死正在运行中的线程所以这样操作是非常危险的。因为它是在UI线程中被动掉用的所以很不安全。
 invalidate()  更新整个屏幕区域
 invalidate(Rect rect) 更新Rect区域
 invalidate(l, t, r, b) 更新指定矩形区域

3.postInvalidate()
 在非UI线程中使用(工作者线程中被调用)。  使用postInvalidate()方法来刷新屏幕,调用后它会用handler通知UI线程重绘屏幕。postInvalidate(left, top, right, bottom) 方法 通过UI线程来刷新规定矩形区域。

invalidate()和postInvalidate()的使用与区别- http://blog.csdn.net/molu_chase/article/details/52572796

Android视图状态及重绘流程分析,带你一步步深入了解View(三)- http://blog.csdn.net/guolin_blog/article/details/17045157

Invalidate和postInvalidate,android界面刷新- http://blog.csdn.net/vincent_czz/article/details/7018725

0 0