ViewTreeObserver

来源:互联网 发布:win10系统图标网络灰色 编辑:程序博客网 时间:2024/05/18 02:07

api的概述:

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 View.getViewTreeObserver() for more information.

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


包含下面6个事件:

interface  ViewTreeObserver.OnDrawListener 

挡在一个视图树绘制时,所要调用的回调函数的接口类(level 16)

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

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

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

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

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


具体的实例,

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

[java] view plaincopy
  1. ViewTreeObserver observer = view.getViewTreeObserver();    
  2. observer .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {    
  3.            @Override    
  4.            public void onGlobalLayout() {    
  5.               view.getViewTreeObserver().removeGlobalOnLayoutListener(this);    
  6.     final int w = view.getMeasuredWidth();  
  7.             final int h = view.getMeasuredHeight();  
  8.            }    
  9.        });   


2,启动帧动画

使用ViewTreeObserver.OnPreDrawListener listener:当一个视图树将要绘制时产生事件,可以添加一个其事件处理函数:onPreDraw

[html] view plaincopy
  1. OnPreDrawListener opdl=new OnPreDrawListener(){  
  2.         @Override  
  3.         public boolean onPreDraw() {  
  4.             animDraw.start();  
  5.             return true;  
  6.         }  
  7.     };  
  8.    
  9. //onCreate方法中  
  10. imageV.getViewTreeObserver().addOnPreDrawListener(opdl);  


view也有onfocusChangedListener,是不是有些重复呢,这些回调肯定和view中的对应的回调有关联的,只不过这里的是有Global这个关键字,范围更大,其他的用处深入android源码应该可以找到挺多的,待补充吧。

0 0
原创粉丝点击