关于Android中的ViewTreeObserver

ViewTreeObserver结构

extends Object
java.lang.Object
   ↳     android.view.ViewTreeObserver

ViewTreeObserver概述

A view tree observer is used to register listeners that can be notified of global changes in the view tree. 
Such global events include, but are not limited to, layout of the whole tree, beginning of the drawing pass, touch mode change.... 
A ViewTreeObserver should never be instantiated by applications as it is provided by the views hierarchy. 
Refer to getViewTreeObserver() for more information.

这个观察者用来监听视图树,会监听视图树发生全局变化时发出的通知。这里指的全局事件包括并且不局限在如下几个:整个视图树的布局变化,开始绘制视图,触摸模式改变等等。html

ViewTreeObserver是不能被应用程序实例化的,由于它是由视图提供的,经过view.getViewTreeObserver()获取。详情须要查看getViewTreeObserver()方法。java

注:简单的说,这是个view事件的观察者。要注意的是它的初始化就是调用View.getViewTreeObserver()android

ViewTreeObserver内部类

 interface                ViewTreeObserver.OnDrawListener                        

Interface definition for a callback to be invoked when the view tree is about to be drawn.app

当在一个视图树绘制时,所要调用的回调函数的接口类

注:Unlike with , this method cannot be used to cancel the current drawing pass.
与OnPreDrawListener不一样的是,不能在这个接口中取消绘制过程ViewTreeObserver.OnPreDrawListener
 interface                  ViewTreeObserver.OnGlobalFocusChangeListener                   

Interface definition for a callback to be invoked when the focus state within the view tree changes.ide

当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
 interface               ViewTreeObserver.OnGlobalLayoutListener                   

 Interface definition for a callback to be invoked when the global layout state or the visibility of views within the view tree changes.函数

当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
 interface               ViewTreeObserver.OnPreDrawListener                     

 Interface definition for a callback to be invoked when the view tree is about to be drawn.布局

当一个视图树将要绘制时,所要调用的回调函数的接口类
 interface               ViewTreeObserver.OnScrollChangedListener                   

Interface definition for a callback to be invoked when something in the view tree has been scrolled.  动画

当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
 interface               ViewTreeObserver.OnTouchModeChangeListener                 

 Interface definition for a callback to be invoked when the touch mode changes.this

当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类

ViewTreeObserver公共方法

1.public void addOnDrawListener (ViewTreeObserver.OnDrawListener listener)spa

/**注册一个回调函数,当在一个视图树绘制时调用这个回调函数。
 * 参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

2.public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener)

/**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
 * 参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

3.public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)

/**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

4.public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)

/**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

5.public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener listener)

/**注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

6.public void addOnTouchModeChangeListener (ViewTreeObserver.OnTouch3.监听焦点的变化ModeChangeListener listener)

/**注册一个回调函数,当一个触摸模式发生改变时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false
 */

7.public final void dispatchOnDraw ()

//告知相应监听器,视图绘制开始了

8.public final void dispatchOnGlobalLayout ()

//当整个布局发生改变时通知相应的注册监听器。若是你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在GONE状态下,它能够被手动的调用

9.public final boolean dispatchOnPreDraw ()

/**当一个视图树将要绘制时通知相应的注册监听器。若是这个监听器返回true,则这个绘制将被取消并从新计划。若是你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在一个GONE状态下,它能够被手动的调用
 *返回值  当前绘制可以取消并从新计划则返回true,不然返回false。
 */

10.public boolean isAlive ()

/**指示当前的ViewTreeObserver是否可用(alive)。当observer不可用时,任何方法的调用(除了这个方法)都将抛出一个异常。若是一个应用程序保持和ViewTreeObserver一个历时较长的引用,它应该老是须要在调用别的方法以前去检测这个方法的返回值。
 *返回值 但这个对象可用则返回true,不然返回false   
 */

11.public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

/**移除以前已经注册的全局布局回调函数。
 *参数 victim 将要被移除的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false   
 */

12.public void removeOnDrawListener (ViewTreeObserver.OnDrawListener victim)

/**移除以前已经注册的视图绘制回调函数。
 *参数 victim 将要被移除的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false   
 */

13.public void removeOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener victim)

/**移除以前已经注册的焦点改变回调函数。
 *参数 victim 将要被移除的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false 
 */

14.public void removeOnPreDrawListener (ViewTreeObserver.OnPreDrawListener victim)

/**移除以前已经注册的预绘制回调函数。
 *参数 victim 将要被移除的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false  
 */

15.public void removeOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener victim)

/**移除以前已经注册的滚动改变回调函数。
 *参数 victim 将要被移除的回调函数
 *异常 IllegalStateException       若是isAlive() 返回false 
 */

16.public void removeOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener victim)

/**移除以前已经注册的触摸模式改变回调函数
 *参数 victim 将要被移除的回调函数
 *异常  IllegalStateException       若是isAlive() 返回false
 */

ViewTreeObserver具体示例

1.在OnCreate()中获取控件高度与宽度

ViewTreeObserver observer = view.getViewTreeObserver();    
observer .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {    
           @Override    
           public void onGlobalLayout() {    
              view.getViewTreeObserver().removeGlobalOnLayoutListener(this);    
            final int w = view.getMeasuredWidth();  
            final int h = view.getMeasuredHeight();  
           }    
       });

 

可是须要注意的是OnGlobalLayoutListener可能会被屡次触发,所以在获得了高度以后,要将OnGlobalLayoutListener注销掉。

2.启动帧动画

OnPreDrawListener opdl=new OnPreDrawListener(){  
        @Override  
        public boolean onPreDraw() {  
            animDraw.start();  
            return true;  
        }  
    };  
   
//onCreate方法中  
imageV.getViewTreeObserver().addOnPreDrawListener(opdl);

3.监听焦点的变化

// onGlobalFocusChanged 是接口 ViewTreeObserver.OnGlobalFocusChangeListener  
        // 中定义的方法。    
        // 焦点发生变化时,会触发这个方法的执行  
        @Override  
        public void onGlobalFocusChanged(View oldFocus, ViewnewFocus)  
        {  
            if (oldFocus != null && newFocus!= null )  
            {  
                 tv_display .setText( "Focus /nFROM:/t" + oldFocus.toString() + "/n    TO:/t" + newFocus.toString());  
            }  
        }

 

须要注意的是,布局中的任何一个view添加了这个监听,该布局的任意控件的焦点变化都可以监听的到。

相关文章
相关标签/搜索