原文:https://blog.csdn.net/ddwhan0123/article/details/50601782
* invalidate() :*
请求重绘View树,即draw()过程。把例子中他是整个刷新着UI,并且从头到尾并不会触发onMeasure()方法(控制大小用)。如果是View就重绘View,如果是ViewGroup就全部重绘。
那什么方法会操作控件的大小呢?
* requestLayout()*
他跟invalidate()相反,他只调用measure()和layout()过程,不会调用draw()。
那有些同学要问,我如果需要局部刷新怎么办?
使用 requestFocus()方法,他只刷新你要刷新的地方。
他是让我们的某一部分获取焦点,获取焦点的会导致view的重绘。
参考:https://blog.csdn.net/wning1/article/details/52504183
在自定义控件的过程会遇到以上方法,三个方法的区别如下:
1. requeLayout() : 控件会重新执行 onMesure() onLayout() ,比如 ScrollView中有LinearLaout ,LinearLayout里面有纵向排列的ImageView和TextView,那么假如ImageView的长宽发生了变化,而要立即在手机上显示这个变化的话,就可调用 imageView.requestLayout();这样的话ScrollView 会重新执行onMesure()这个方法会确定控件的大小然后在确定出自己的宽高,最后在执行onLayout(),这个方法是对所有的子控件进行定位的。他只调用measure()和layout()过程,不会调用draw()。
2.invalidate() :是自定义View 的时候,重新执行onDraw()方法,当view只在内容和可见度方面发生变化时调用。
3 layout():对控件进行重新定位执行onLayout()这个方法,比如要做一个可回弹的ScrollView,思路就是随着手势的滑动子控件滑动,那么我们可以将ScrollView的子控件调用layout(l,t,r,b)这个方法就行了。