View宽高测量方法:

测量方法有三种,如下:

1)(直接在onCreate()执行)

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();
textView.append("\n"+height+","+width);

2)2和3都是在onCreate()调用完后回调拿到组件的宽高

ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
textView.append("\n"+height+","+width);
return true;
}
});

3)

ViewTreeObserver vto2 = imageView.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());
}
});

注意:方法一比其他方法多一次onMeasure计算,方法二的回调函数会被多次调用。

转自http://blog.csdn.net/johnny901114/article/details/7839512

ViewTreeObserver

一、结构

public final class ViewTreeObserver extends Object
java.lang.Object
android.view.ViewTreeObserver

二、概述

这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知。这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等。ViewTreeObserver不能够被应用程序实例化,因为它是由视图提供,参照getViewTreeObserver()以查看更多信息。

三、内部类

interface  ViewTreeObserver.OnGlobalFocusChangeListener
2   //当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
3
4   interface ViewTreeObserver.OnGlobalLayoutListener
5   //当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
6
7   interface ViewTreeObserver.OnPreDrawListener
8   //当一个视图树将要绘制时,所要调用的回调函数的接口类
9
10   interface ViewTreeObserver.OnScrollChangedListener
11   //当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
12
13   interface ViewTreeObserver.OnTouchModeChangeListener
14   //当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类

四、公共方法

 /**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
2   * 参数 listener 将要被添加的回调函数
3   *异常 IllegalStateException 如果isAlive() 返回false
4   */
5  public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener)
6
7
8  /**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
9   *参数 listener 将要被添加的回调函数
10   *异常 IllegalStateException 如果isAlive() 返回false
11   */
12  public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
13   
14
15   
16  /**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
17   *参数 listener 将要被添加的回调函数
18   *异常 IllegalStateException 如果isAlive() 返回false
19   */
20  public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)
21
22  
23  /**注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
24   *参数 listener 将要被添加的回调函数
25   *异常 IllegalStateException 如果isAlive() 返回false
26   */
27  public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener listener)
28
29  
30  /**注册一个回调函数,当一个触摸模式发生改变时调用这个回调函数。
31   *参数 listener 将要被添加的回调函数
32   *异常 IllegalStateException 如果isAlive() 返回false
33   */
34  public void addOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener listener)
35
36   
37  //当整个布局发生改变时通知相应的注册监听器。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在GONE状态下,它可以被手动的调用
38  public final void dispatchOnGlobalLayout ()
39
40  /**当一个视图树将要绘制时通知相应的注册监听器。如果这个监听器返回true,则这个绘制将被取消并重新计划。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在一个GONE状态下,它可以被手动的调用
41   *返回值 当前绘制能够取消并重新计划则返回true,否则返回false。
42   */
43  public final boolean dispatchOnPreDraw ()
44
45  /**指示当前的ViewTreeObserver是否可用(alive)。当observer不可用时,任何方法的调用(除了这个方法)都将抛出一个异常。如果一个应用程序保持和ViewTreeObserver一个历时较长的引用,它应该总是需要在调用别的方法之前去检测这个方法的返回值。
46   *返回值 但这个对象可用则返回true,否则返回false
47   */
48  public boolean isAlive ()
49
50
51  /**移除之前已经注册的全局布局回调函数。
52   *参数 victim 将要被移除的回调函数
53   *异常 IllegalStateException 如果isAlive() 返回false
54   */
55  public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
56   
57  /**移除之前已经注册的焦点改变回调函数。
58   *参数 victim 将要被移除的回调函数
59   *异常 IllegalStateException 如果isAlive() 返回false
60   */
61  public void removeOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener victim)
62   
63  /**移除之前已经注册的预绘制回调函数。
64   *参数 victim 将要被移除的回调函数
65   *异常 IllegalStateException 如果isAlive() 返回false
66   */
67  public void removeOnPreDrawListener (ViewTreeObserver.OnPreDrawListener victim)
68   
69  /**移除之前已经注册的滚动改变回调函数。
70   *参数 victim 将要被移除的回调函数
71   *异常 IllegalStateException 如果isAlive() 返回false
72   */
73  public void removeOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener victim)
74  
75  /**移除之前已经注册的触摸模式改变回调函数
76   *参数 victim 将要被移除的回调函数
77   *异常  IllegalStateException 如果isAlive() 返回false
78   */
79  public void removeOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener victim)

五、代码示例


1、创建监听器

private final ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = -1;
int height = -1; try {
width = getActivity().getWindow().getDecorView().getWidth();
height = getActivity().getWindow().getDecorView().getHeight();
} catch (Exception e) {
// called too early. so, just skip.
} if (width != -1 && mGlobalLayoutWidth != width) {//只有当尺寸真正有了数值,即已经确定了,更新UI才有意义
mGlobalLayoutWidth = width;
updateUI();
} else if (height != -1 && mGlobalLayoutHeight != height) {
mGlobalLayoutHeight = height;
updateUI();
} } };

2、一般在onCreate或onCreateView中注册监听器

mViewTreeObserver = getActivity().getWindow().getDecorView().getViewTreeObserver();
mViewTreeObserver.addOnGlobalLayoutListener(mGlobalLayoutListener);

转自http://www.tuicool.com/articles/fi6BJ3N和http://www.cnblogs.com/xingfuzzhd/archive/2013/06/25/3154674.html

 

android笔记:获取View组件宽度以及ViewTreeObserver的更多相关文章

  1. 获取View组件宽度以及ViewTreeObserver

    View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) ,View.MeasureSpec.UNSPECIFIED); ,View.MeasureSpec.UNSPEC ...

  2. Android 开发 Activity里获取View的宽度和高度 转载

    原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...

  3. [Android学习笔记]获取view的尺寸和坐标

    对于UI方面很多时候需要获取它的很多信息,具体情况见view的文档 View文档 http://developer.android.com/training/index.html 常用方法:获取vie ...

  4. android之获取屏幕的宽度和高度

    获取屏幕的宽度和高度: 方法一: //获取屏幕的宽度 public static int getScreenWidth(Context context) { WindowManager manager ...

  5. Android开发 获取View的尺寸的2个方法

    前言 总所周知,在activity启动的onCreate或者其他生命周期里去获取View的尺寸是错误的,因为很有可能View并没有初始化测量绘制完成.你这个时候获取的宽或的高不出意外就是0.所以,我们 ...

  6. HackThirteen 在onCreate()方法中获取View的宽度和高度

    1.概要:     Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出:     如果开发一些依赖于UI控件的宽和高的功 ...

  7. Android笔记:四大组件

    1.Activity(是用户可以看到的主要的界面,使用时需要在AndroidManifest.xml中编辑声明.) 启动模式: 启动模式一共有四种,分别是standard.singleTop.sing ...

  8. Android笔记-获取图片

     1. 图片放在sdcard中,根据路径获得: Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是图片的路径,跟目录是/sdcard ...

  9. Android 获取View宽度

    /***************************************************************************** * Android 获取View宽度 * ...

随机推荐

  1. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  2. 应用工具 .NET Portability Analyzer 分析迁移dotnet core

    大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...

  3. Angular企业级开发-AngularJS1.x学习路径

    博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...

  4. Android Studio —— 重装 HAXM

    Android Studio -- 重装 HAXM 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. Android SDK 自带模拟器一直以慢.卡 ...

  5. web api接口同步和异步的问题

    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...

  6. 基于NPOI的Excel数据导入

    从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请 ...

  7. 品牌营销:不要Beat,要逼格!

             品牌营销:不要Beat,要逼格! 奥美的创始人大卫·奥格威说,广告营销应当是"具有风度的推销产品".而当下的营销手段,"风度"早已被抛之脑后, ...

  8. iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理

    在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...

  9. WINDOWS系统下MYSQL安装过程中的注意事项

    1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI ...

  10. myrocks复制中断问题排查

    背景 mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛.随着SSD逐渐普及,硬件存储成本越来越高,面向写优化 ...