ViewTreeObserver类监听ViewTree

ViewTreeObserver,顾名思义,是一个Observer,主要用来监听ViewTree的变化 ViewTreeObserver不应该被应用程序实例化,因为他是由views hierarchy提供的,我们要使用view.getViewTreeObserver()方法来获取它的实例。 它提供了一些方法和接口,用来让我们来监听view视图的变化。 使用步骤:

  1. 获取ViewTreeObserver实例ViewTreeObserver observer = view.getViewTreeObserver()

  2. 给observer添加监听:observer.setXXXListener(),使用observer.removeXXXListener()移除监听,以防多次调用。

这样便可以监听ViewTree的一些状态了。

ViewTreeObserver提供了以下接口(注意OnPreDrawListener和OnDrawListener的区别):

// Api 1:view tree 中每个view将要被绘制时的监听,所以有可能会被调用多次
// 它的方法需要返回一个boolean,这个boolean代表是否继续当前的绘制,true为继续,false则取消绘制过程
interface	ViewTreeObserver.OnPreDrawListener
// Api 16:view tree 中每个view将要被绘制时的监听,与上一个不同的是,该方法没有任何返回值,且这个方法也不能改变绘制的过程,同样也不能取消绘制过程
interface	ViewTreeObserver.OnDrawListener
// view tree 的焦点发生改变的监听 
interface	ViewTreeObserver.OnGlobalFocusChangeListener
// 当view tree 中的布局或者可见性发生改变时调用
interface	ViewTreeObserver.OnGlobalLayoutListener
// 视图树中有view发生滚动的监听
interface	ViewTreeObserver.OnScrollChangedListener
// 视图树中有view的touch mode 发生改变的监听
interface	ViewTreeObserver.OnTouchModeChangeListener
// view hierarchy 被attach或detached到window上时的监听
interface	ViewTreeObserver.OnWindowAttachListener
// 当view hierarchy 所在的窗口的焦点发生改变时的监听
interface	ViewTreeObserver.OnWindowFocusChangeListener

isAlive():判断ViewTreeObserver是否处于活动状态,如果不处于,调用除了这个方法外的其他方法都会抛出异常,所以如果想让ViewTreeObserver保持长期的活动,那么在使用它时先调用此方法判断其是否活动

final void dispatchOnDraw()通知已经注册的Listener,绘制要开始了 final boolean dispatchOnPreDraw()通知已经注册的Listener,绘制要开始了 final void dispatchOnGlobalLayout()通知已经注册的Listener,布局要开始了

dispatchOnDraw()源码如下:


    /**
     * Notifies registered listeners that the drawing pass is about to start.
     */
    public final void dispatchOnDraw() {
        if (mOnDrawListeners != null) {
            final ArrayList<OnDrawListener> listeners = mOnDrawListeners;
            int numListeners = listeners.size();
            for (int i = 0; i < numListeners; ++i) {
                listeners.get(i).onDraw();
            }
        }
    } 

所以由源码可知,该方法用于主动触发监听。

最后更新于