<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

Android Custom View ----invalidate() 、postInvalidate() and requestLayout()相关推荐

  1. Android Custom View --- Circular(环形条)

    Android Custom View - Circular(环形条) 这次是实现一个简单的环形条,下图这样的,还是尽量简单的写,让新手能够看懂 这一次没多少代码,就贴一下核心部分,别的大家可以自己看 ...

  2. Android面试:Invalidate、RequestLayout

    Invalidate/RequestLayout区别 先放上结论 requestLayout会直接递归调用父窗口的requestLayout,直到ViewRootImpl,然后触发peformTrav ...

  3. Android笔记:invalidate()和postInvalidate() 的区别及使用(转载)

    原文 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI ...

  4. Android笔记:invalidate()和postInvalidate() 的区别及使用

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程 ...

  5. Android中的invalidate()和postInvalidate()

    invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...

  6. Android: Custom View和include标签的区别

    Custom View, 使用的时候是这样的: <com.example.home.alltest.view.MyCustomViewandroid:id="@+id/customVi ...

  7. android 中的invalidate 和 postInvalidate

    存在原因:android只允许在ui线程更新ui. invalidate 在ui线程上请求更新view.比如直接在onDraw中调用: postInvalidate 用于在其他新启的线程处更新view ...

  8. Android Custom View系列《圆形菜单一》

    前言 自定义view能够做出很多不同寻常的效果,圆形菜单交互效果不错,目前网上有两个版本,虽然比较庞大,但非常值得研究与学习. radial-menu-widget: https://code.goo ...

  9. android自定义view生命周期,android基础之自定义view

    一.Custom View 1.view的继承关系 view继承关系.png 2.Android 如何绘制试图层次 当activity获取焦点时,它必须提供layout层次的根节点,然后android ...

最新文章

  1. feign post 传递空值_HTTP中GET与POST的区别,99 %的人都理解错了
  2. 数据库之字段数据类型
  3. python装饰器作用-如何理解Python装饰器?
  4. pytorch教程龙曲良16-20
  5. php while 自增,PHP 布尔值的自增与自减的实现方法
  6. addWeighted()
  7. JVM的内存管理 Ⅰ
  8. 独家 | 腾讯无人车首次曝光,还把车子开上了四环
  9. oracle exp不生成dumpfile,预估出实际导出文件的大小。
  10. linux caffe ssd 编译,Ubuntu 16.04 编译 Caffe SSD
  11. python实现移除列表指定位置的元素
  12. 如何统计区域内部公路总长度和绘制数据直方图
  13. Android 接入阿里云推送com.aliyun.ams:alicloud-android-push:3.7.4步骤(二)
  14. php网页能实现飘窗吗,网站飘窗广告的实现方法
  15. provisional headers are shown问题排查
  16. 值得推荐的经济学中文教材-转
  17. android界面自动跳转,android实现欢迎界面的自动跳转
  18. 小升初冲击SSF未遂,进入“帝都理工附中
  19. 解决Photoshop CS6在window10中窗口字体太小问题
  20. 罗克韦尔自动化发布2019年企业责任报告,并启动新的企业责任与可持续发展在线内容中心

热门文章

  1. 如何在单元测试中测试异步函数,block回调这种
  2. MySQL 二进制日志(Binary Log)
  3. 订餐系统之自动确认淘点点订单
  4. 单个下拉框数据保持问题
  5. SQL:给查询添加一个合计行
  6. HP DL360 G7安装esxi 6.0
  7. sublime3安装package controller遇到的问题
  8. 每个zone的low memory是怎么计算出来的
  9. IntelliJ IDEA 建空包合并问题。
  10. Android UI布局之LinearLayout