获取控件宽高

在onCreate中如何获得View宽高

经常我们需要在布局中动态的去改变某些View的宽高,并且是和其他View的宽高有联系的,所以我们要先获取另外一个view的宽高,来判断设置当前view的宽高,但是在onCreate() onResume()获取View的width方法中都没有办法获取到View的实际宽高(这种情况使用动态布局使用wrap_content或match_parent就会出现).所以,我们必须用一种变通的方法,等View绘制完成后去获取width和Height

  1. 监听Draw/Layout时间:ViewTreeObserver

首先先介绍一下这个ViewTreeObserver

  • 这个观察者是用来监听视图树的监听视图树发生全局变化时发出的通知
  • 布局变化,开始绘制,触摸模式改变等
  • 不能被实例化,通过View.getViewTreeObserver()获取
    简单来说:这是个View事件的观察者.要注意的是他的初始化就是调用View.getViewtreeObserve()

使用

  • 在onCreat()中获取控件高度和宽度(但是需要注意的是OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。)
ViewTreeObserver observer = view.getViewTreeObserver();    
observer .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {    
           @Override    
           public void onGlobalLayout() {    
              view.getViewTreeObserver().removeGlobalOnLayoutListener(this);    
            final int w = view.getMeasuredWidth();  
            final int h = view.getMeasuredHeight();  
           }    
       });  
  • 启动帧动画
OnPreDrawListener opdl=new OnPreDrawListener(){  
        @Override  
        public boolean onPreDraw() {  
            animDraw.start();  
            return true;  
        }  
    };  

//onCreate方法中  
imageV.getViewTreeObserver().addOnPreDrawListener(opdl); 

2、将一个runnable添加到Layout队列中:View.post()
这个是最常见的在onCreate获取view款宽高的方法调用view.post()一个runnable就可以了,runnable对象中的方法会在view的measure,layout等事件触发(UI事件队列会按顺序处理时间,在setContentView()被调用后,事件队列中会包含一个重新layout的message,所有post到队列中的东西都会在layout发生变化后执行)

 view.post(new Runnable() {
             @Override
             public void run() {
                 view.getHeight(); //height is ready
             }
         });

这个方法比ViewTreeObserver好:
1、你的代码只会执行一次,而且你不用在在每次执行后将Observer禁用,省心多了。
2、语法很简单

你可能感兴趣的:(Android)