当前位置: 代码迷 >> 综合 >> invalidate()和requestLayout()方法的区别
  详细解决方案

invalidate()和requestLayout()方法的区别

热度:27   发布时间:2023-10-10 08:15:37.0

原文: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)这个方法就行了。