获取控件高度等信息

很多时候,我们需要获得控件的信息(如:高度),用于实现一些比较好的效果,比如好看动画什么的等等。
在只有onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的,以前的想法是通过延迟等布局被画完了才获取控件的高度。


try {
	new Handler().postDelayed(new Runnable() {

		public void run() {
			......//获取控件高度信息
		}
	}, 100);
} catch (Exception ex) {
	ex.printStackTrace();
}

这种方法是能够得到正确的信息的,但是总感觉这种方法不是很好。
发现一些更好的方法,不用做延迟就能得到控件的信息。
方法一:

int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 
imageView.measure(w, h); 
int height =imageView.getMeasuredHeight(); 
int width =imageView.getMeasuredWidth();

方法二:
ViewTreeObserver vto = imageView.getViewTreeObserver();

              vto.addOnPreDrawListener(new OnPreDrawListener() {

                      @Override
                      public boolean onPreDraw() {
                              height = imageView.getHeight();
			      width = imageView.getWidth()); 

                              return true;
                      }
              });


方法三:
ViewTreeObserver vto = imageView.getViewTreeObserver();   
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override   
    public void onGlobalLayout() { 
        imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);   
        height = imageView.getHeight();
	width = imageView.getWidth()); 
    }   
});

经过重写控件的onMeasure()方法输出调用次数,发现这几个方法有如下特点
方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话,不建议使用,如listView等.
方法二,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用.
方法三,比较合适.
当然,实际应用的时候需要根据实际情况而定


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值