Android 关于getViewTreeObserver()

    有时候需要在onCreate种得到控件的宽,高等。但是通过getWidth(), getHeight(), getTop()等方法都无法获得控件真实值,只能得到0;这是因为View组件布局要在onResume()方法回调后才能完成。因为,我们可以通过getViewTreeObserver().addOnGlobleLayoutListener()来获取控件的宽高等。
    addOnGlobleLayoutListener()是当一个视图树的布局发生改变时候,所要调用的回调函数接口。这是一个监听视图树的观察者(Observer),在视图树的全局事件改变时得到通知。
    下面即是我们用addOnGlobleLayoutListener(),来获取一个视图的真实高度:



     private TextView tv;
    /***初始化得到view事件观察者***/
    ViewTreeObserver observer = tv.getViewTreeObserver();
    /**
    *当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,
    *所要调用的回调函数的接口类
    **/
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //获取控件高度
            imageHeight = mDetailProductIv.getHeight();
       /***OnGloabalLayoutListener可能会被多次触发,因此在得到高度后要注销掉***/
    observer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });

除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:

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

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值