View的getWidth/getHeight与getMeasuredWidth/getMeasuredHeight的区别

来源:互联网 发布:大数据时代杂志 编辑:程序博客网 时间:2024/05/21 09:02


转载自http://blog.csdn.net/u010852801/article/details/45670571

某个View的显示流程是这样的:

Activity.onCreate–>Activity.onStart–>Activity.onResume–>image.onMeasure–>image.onLayout–>onGlobalLayoutListener–>Activity.onWindowFocusChanged–>….–>image.onDraw

onWindowFocusChanged是当activity可见时的调用的,在此之前的函数中调用View.getWidth/getHeight得到的是0,onWindowFocusChanged函数中获View.getWidth/getHeight是合适的。getWidth/getHeight一般是控件添加到Activity之后,显示到屏幕中的实际宽度。而View.getMeasureWidth/getMeasureHeight是配合view.measure使用的,如果未调用View.measure,那么调用view.getMeasureWidth的效果和View.getWidth一样。

如果我们要在onWindowFocusChanged之前的函数,如onCreate中获得View的宽度/高度,有如下三种方法:

方法一:

[java] view plain copy
print?
  1. int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  2. int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  3. view.measure(width,height);  
  4. int height=view.getMeasuredHeight();   
  5. int width=view.getMeasuredWidth();  
int width =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int height =View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);view.measure(width,height);int height=view.getMeasuredHeight(); int width=view.getMeasuredWidth();

方法二:
//增加组件绘制之前的监听
[java] view plain copy
print?
  1. ViewTreeObserver vto =view.getViewTreeObserver();   
  2. vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {   
  3.    @Override  
  4.    public boolean onPreDraw() {   
  5.      int height =view.getMeasuredHeight();   
  6.      int width =view.getMeasuredWidth();       
  7.    }  
  8. });  
ViewTreeObserver vto =view.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {    @Override   public boolean onPreDraw() {      int height =view.getMeasuredHeight();      int width =view.getMeasuredWidth();        }});

方法三:
//增加整体布局监听
[java] view plain copy
print?
  1. ViewTreeObserver vto = view.getViewTreeObserver();    
  2. vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){   
  3.     @Override   
  4.     public void onGlobalLayout() {  
  5.       view.getViewTreeObserver().removeGlobalOnLayoutListener(this);       
  6.       int height =view.getMeasuredHeight();   
  7.       int width =view.getMeasuredWidth();    
  8.     }   
  9. });  
ViewTreeObserver vto = view.getViewTreeObserver();  vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){     @Override     public void onGlobalLayout() {      view.getViewTreeObserver().removeGlobalOnLayoutListener(this);           int height =view.getMeasuredHeight();       int width =view.getMeasuredWidth();      } });



    </article>
原创粉丝点击