android中获取View宽高的方法

  最近开了<android开发艺术探索>收货很多 ,很推荐这本书.

  进入正题, 很多时候你会发现在activity中获取不到view的 宽高. 获取的总是0,  这是因为view在measure的时候和activity的生命周期不是同步的, 创建好activity后view的measure还没有创建,所以得到的宽高自然是0. 下面推荐3种获取的方法 供大家分享:

(1). 通过onWindowFocusChanges

这个方法的含义是:View已经初始化完毕了, 宽高已经准备好了这时候去获宽高是没有问题的. 需要注意的是, onWindowFocusChange会被调用多次, 在activity失去和获取焦点的时候都会调用.如此平凡的进行调用肯定是不好的 ,解决如下:

   public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(hasFocus){
        	int width = view.getMeasuredWidth();
        	int height = view.getMeasuredHeight();
        }
    }

(2). view.post(runnable)

通过post可以将一个runnable投递到消息队列的尾部,然后等待Lopper调用次runnable的时候, View也已经初始化好了, 代码如下:

    protected void onStart() {
        super.onPause();
        view.post(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int width = view.getMeasuredWidth();
				int height = view.getMeasuredHeight();
			}
		});
    }

(3) ViewTreeObserver

使用ViewTreeObserver的众多回调可以完成这个功能, 比如使用OnGlobalLayoutListener这个接口, 让View树的状态发生改变或者View树的内部的View
的可见性发生改变的时候,onGlobalLayout方法将被回调, 因此这是获取View的宽高一个最好的时机.需要注意的是, 伴随View的树的状态的改变等, onGlobalLayout也会被调用对此,解决代码如下

    protected void onStart() {
        super.onStart();
        ViewTreeObserver observer = view.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			
			@Override
			public void onGlobalLayout() {
				// TODO Auto-generated method stub
				int width = view.getMeasuredWidth();
				int height = view.getMeasuredHeight();
			}
		});
        
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值