View[5] ViewTreeObserver

【参考链接】

 

View类提供了getViewTreeObserver()方法来获取一个ViewTreeObserver对象

通过给这个对象add各种Listener,可以实现相关情况的回调,并且在使用完成以后remove()掉。

是一个观察者模式的实现。



不过实验的时候,调用viewscrollTo()/scrollBy()并未触发onScrollChangedListener.

 

需要注意的是

1、 在视图树中的任何View使用getViewTreeObserver(),获取到的都是同一个ViewTreeObserver对象


2、在使用ViewTreeObserver对象前最好通过isAlive()方法进行判断其是否还alive

 

以如下代码为例

final ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
if
(viewTreeObserver.isAlive())
   viewTreeObserver.addOnTouchModeChangeListener(
new ViewTreeObserver.OnTouchModeChangeListener(){
       
@Override
       
public void onTouchModeChanged(boolean b) {
           Log.e(
"ViewTreeObserverX", "onTouchModeChanged()");
       
}
    })
;

if
(viewTreeObserver.isAlive())
   viewTreeObserver.addOnGlobalFocusChangeListener(
new ViewTreeObserver.OnGlobalFocusChangeListener(){
       
@Override
       
public void onGlobalFocusChanged(View view, View view1) {
           Log.e(
"ViewTreeObserverX", "onGlobalFocusChanged()");
       
}
    })
;

if
(viewTreeObserver.isAlive())
   viewTreeObserver.addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener(){
       
@Override
       
public void onGlobalLayout() {
           Log.e(
"ViewTreeObserverX", "onGlobalLayout()");
       
}
    })
;

if
(viewTreeObserver.isAlive())
   viewTreeObserver.addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
       
@Override
        
public boolean onPreDraw() {

           Log.e(
"ViewTreeObserverX", "onPreDraw()");
           if
(viewTreeObserver.isAlive())
               
viewTreeObserver.removeOnPreDrawListener(this);
           else
               
tv.getViewTreeObserver().removeOnPreDrawListener(this);

           return false;
       
}
    })
;

if
(viewTreeObserver.isAlive())
   viewTreeObserver.addOnScrollChangedListener(
new ViewTreeObserver.OnScrollChangedListener(){
       
@Override
       
public void onScrollChanged() {
           Log.e(
"ViewTreeObserverX", "onScrollChanged()");
       
}
    })
;

 

在整个流程中的调用时机如下

onGlobalLayout()为例,可以在其中去获取View的长宽的和位置


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值