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

某个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的宽度/高度,有如下三种方法:

方法一:

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();

方法二:

//增加组件绘制之前的监听

ViewTreeObserver vto =view.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
   @Override
   public boolean onPreDraw() {
     int height =view.getMeasuredHeight();
     int width =view.getMeasuredWidth();
   }
});

方法三:

//增加整体布局监听

ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      int height =view.getMeasuredHeight();
      int width =view.getMeasuredWidth();
    }
});
时间: 2024-10-09 14:08:23

View的getWidth/getHeight与getMeasuredWidth/getMeasuredHeight的区别的相关文章

view的getWidth() getHeight() 总是返回0 的几种解决方法

当我们在oncreate 调用 getwith() 与 getheigh()时返回0 的原因是我们的view 在此时还没有绘制出来,不光在oncreate .Activity生命周期中,onStart,onResume,onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时. 所以一个解决方法: 就是将 getwith放到onWindowFocusChanged()中.这个onWindowFocusChanged指的

android中getWidth()和getMeasuredWidth()之间的区别

先给出一个结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小. 从源码上开始分析一下这两个方法的区别.首先来看一下getMeasuredWidth()这个方法. 1 public final int getMeasuredWidth() { 2 return mMeasuredWidth & MEASURED_S

[学习总结]1、View的scrollTo 和 scrollBy 方法使用说明和区别

参考资料:http://blog.csdn.net/vipzjyno1/article/details/24577023 非常感谢这个兄弟! 先查看这2个方法的源码: scrollTo: 1 /** 2 * Set the scrolled position of your view. This will cause a call to 3 * {@link #onScrollChanged(int, int, int, int)} and the view will be 4 * invali

Android中View窗口getWidth和getMeasuredWidth的差别

今天在研究自己定义listview的下拉刷新的效果.想移植到项目需求中,再看自己定义源代码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么差别,求教万能的百度,经调研发现这两个方法的不同点是,getWidth获得的是当前View的可视的宽度,可是向下拉刷新这种需求,那个头部提示的View是隐藏起来的这样用getWidth就获取不到View的宽度了.所以採取getMeasuredWidth的方式获得. getMeasuredWidth的方法代表了能够获取View

Android中View窗体getWidth和getMeasuredWidth的区别

今天在研究自定义listview的下拉刷新的效果,想移植到项目需求中,再看自定义源码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么区别,求教万能的百度,经调研发现这两个方法的不同点是,getWidth获得的是当前View的可视的宽度,但是向下拉刷新这样的需求,那个头部提示的View是隐藏起来的这样用getWidth就获取不到View的宽度了,所以采取getMeasuredWidth的方式获得.getMeasuredWidth的方法代表了可以获取View的可视

关于getWidth(),getHeight()的一个坑

有时,我们为了好的布局,会在程序中,动态地获得一个View的宽高.在做一个练习时,我直接将 int width = gridLayout.getWidth()/10; int height = gridLayout.getHeight()/10; 这两句放在了onCreate()中: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConte

Android进阶笔记05:View、SurfaceView 和GLSurfaceView 的关系和区别

1.  Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:    (1) view.SurfaceView 和 GLSurfaceView的区别如下: • View: 显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,速度较慢 • SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发:是View的子类,类似使用双缓机制

view,SurfaceView,GLSurfaceView的关系和区别

如果你的游戏不吃CPU,用View就比较好,符合标准Android操作方式,由系统决定刷新surface的时机. 但如果很不幸的,你做不到不让你的程序吃CPU,你就只好使用SurfaceView来强制刷新surface了,不然系统的UI进程很可能抢不过你那些吃CPU的线程. 当然其实不止这两种方法来刷新Surface的,这两种只是纯Java应用比较常见的方法. SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主

vmware view桌面虚拟化与普通PC机的区别

谈到桌面虚拟化,大多数人第一感觉就是高大上,但是却很少有人能简单的全面的把桌面虚拟化的区别和优势说出来,这里简单的和大家普及一下桌面虚拟化和普通物理PC的区别,以及桌面虚拟化给用户带来的价值点. 首先,从计算模式方面来说,PC采用的是本地计算模式(即运行的操作系统及应用消耗的都是本地计算机的硬件资源),而桌面虚拟化所有的运算是由数据中心端(服务器和存储设备)来完成的,用户终端只负责输入和输出. 其次,从管理角度来说,两种模式存在着较大的区别: 1.驱动管理 (1)物理PC:不同品牌及型号的PC设