ViewTreeObserver类监听ViewTree
ViewTreeObserver,顾名思义,是一个Observer,主要用来监听ViewTree的变化 ViewTreeObserver不应该被应用程序实例化,因为他是由views hierarchy提供的,我们要使用view.getViewTreeObserver()
方法来获取它的实例。 它提供了一些方法和接口,用来让我们来监听view视图的变化。 使用步骤:
获取ViewTreeObserver实例
ViewTreeObserver observer = view.getViewTreeObserver()
给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();
}
}
}
所以由源码可知,该方法用于主动触发监听。
最后更新于
这有帮助吗?