Android中获取view的宽高的几种方法

来源:互联网 发布:如何举报淘宝卖家 知乎 编辑:程序博客网 时间:2024/06/16 05:11

很多自定义的view中需要在某个方法中获取一个View的宽高之后再进行相应的操作,但activity中的onCreate、onStart、onResume的方法中是无法正确的获取到某个想要获取View的宽高信息的。这是因为View的measure过程和activity的生命周期方法不是同步执行的,因此无法保证activity执行了onCreate、onStart、onResume时View已经测量完毕,如没测量完毕则获取到的宽高为0。

解决这一问题有四种方案:

1.Activity/View#onWindowFocusChanged:

onWindowFocusChanged这个方法的含义是view已经初始化完毕了,宽高已经准备好了。这时候去获取宽高是伪问题的。onWindowFocusChanged会调用多次,当Activity的窗口得到焦点和失去焦点时均会被调用一次。

public void onWindowFocusChanged(boolean){  super.onWidowFocusChanged(hasFocus);  if(hasFoucs){     int width=view.getMeasureWidth();     int height=view.getMeasureHeight();}}

2.view.post(runnable):
通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候,View也已经初始化好了:

protected void onStart(){     super.onStart();     view.post(new Runnable(){       @Override       public void run(){          int width=view.getMeasureWidth();          int height=view.getMeasureHeight();       }     });}

3.ViewTreeObserver:
使用ViewTreeObserver的众多回调可以完成这个功能,如使用OnGlobaLayoutListener这个接口,当View树的状态发生变化或者View树内部的View的可见性发生改变时,onGlobalLayout方法会被调用,因此这时可以获取到View的宽高的信息。

protect void onStart(){    super.onStart();    ViewTreeObserver observer=view.getViewTreeObserver();    observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){      @supperssWarnings("deprecation")      @Override      public void onGlobalLayout(){       view.getViewTreeObserver().removeGlobalLayoutListener(this);       int width=view.getMeasureWidth();       int height=view.getMeasureHeight();      }    });}

4.view.measure(int widthMeasureSpec,int heigtMeasureSpec):
通过手动对View进行measure来得到View的宽高;


原创粉丝点击