1、ViewTree
首先我们来介绍一下 ViewTree 也就是视图树是什么。
View 和 ViewGroup 是 Android UI 的基本组件, 而 ViewGroup 作为容器,可以包含一组 View, 并且 ViewGroup 其本身就是 View 的扩展。
而各种不同的 Widgets 像 TextView,Button 等等也是View的扩展,只不过是放在各种 Layout 里,比如 LinearLayout,RelativeLayout。而 Layout 却是 ViewGroup 的子类。
而 ViewTree 就是各种 View 和 ViewGroup 放在一个 Layout 里组成的树形结构。我们用 XML 编写的布局就是依照 ViewTree 结构层层叠加的。
2、ViewTreeObserver
ViewTreeObserver 是一个注册监听视图树的观察者(observer),会监听视图树发生全局变化时发出的通知。这个全局事件包括整个树的布局,从绘画过程开始,触摸模式的改变等等。
ViewTreeObserver不能够被应用程序实例化,因为它是由视图提供,通过 view.getViewTreeObserver() 方法获取。
简单的说,这是个 view 事件的观察者。要注意的是它的初始化就是调用View.getViewTreeObserver(),所以要使用 ViewTreeObserver 的方法也是使用这样来获得 ViewTreeObserver 对象再调用方法。
3、内部接口
名字 | 说明 |
---|---|
OnDrawListener | 当在一个视图树绘制时,所要调用的回调函数的接口类,与OnPreDrawListener不同的是,不能在这个接口中取消绘制过程 |
OnGlobalFocusChangeListener | 当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类 |
OnGlobalLayoutListener | 当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类 |
OnPreDrawListener | 当一个视图树将要绘制时,所要调用的回调函数的接口类 |
OnScrollChangedListener | 当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类 |
OnTouchModeChangeListener | 当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口 |
4、公共方法
1.
/*
* 注册一个回调函数,当在一个视图树绘制时调用这个回调函数。
*/
public void addOnDrawListener (ViewTreeObserver.OnDrawListener listener)
2.
/*
* 注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
*/
public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener)
3.
/*
* 注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
*/
public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
4.
/*
* 注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
*/
public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)
5.
/*
* 注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
*/
public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener listener)
6.
/*
* 注册一个回调函数,当一个触摸模式发生改变时调用这个回调函数。
*/
public void addOnTouchMo