android笔记:获取View组件宽度以及ViewTreeObserver
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的更多相关文章
- 获取View组件宽度以及ViewTreeObserver
View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) ,View.MeasureSpec.UNSPECIFIED); ,View.MeasureSpec.UNSPEC ...
- Android 开发 Activity里获取View的宽度和高度 转载
原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...
- [Android学习笔记]获取view的尺寸和坐标
对于UI方面很多时候需要获取它的很多信息,具体情况见view的文档 View文档 http://developer.android.com/training/index.html 常用方法:获取vie ...
- android之获取屏幕的宽度和高度
获取屏幕的宽度和高度: 方法一: //获取屏幕的宽度 public static int getScreenWidth(Context context) { WindowManager manager ...
- Android开发 获取View的尺寸的2个方法
前言 总所周知,在activity启动的onCreate或者其他生命周期里去获取View的尺寸是错误的,因为很有可能View并没有初始化测量绘制完成.你这个时候获取的宽或的高不出意外就是0.所以,我们 ...
- HackThirteen 在onCreate()方法中获取View的宽度和高度
1.概要: Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出: 如果开发一些依赖于UI控件的宽和高的功 ...
- Android笔记:四大组件
1.Activity(是用户可以看到的主要的界面,使用时需要在AndroidManifest.xml中编辑声明.) 启动模式: 启动模式一共有四种,分别是standard.singleTop.sing ...
- Android笔记-获取图片
1. 图片放在sdcard中,根据路径获得: Bitmap imageBitmap = BitmapFactory.decodeFile(path) (path 是图片的路径,跟目录是/sdcard ...
- Android 获取View宽度
/***************************************************************************** * Android 获取View宽度 * ...
随机推荐
- [原]CentOS7.2部署node-mapnik
转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...
- DDD 领域驱动设计-看我如何应对业务需求变化,愚蠢的应对?
写在前面 阅读目录: 具体业务场景 业务需求变化 "愚蠢"的应对 消息列表实现 消息详情页实现 消息发送.回复.销毁等实现 回到原点的一些思考 业务需求变化,领域模型变化了吗? 对 ...
- Javascript面向对象类文章目录
1.javaScript的原型继承与多态性 2.JavaScript的继承实现方式 3.JS中 call() 与apply 方法
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入
系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...
- BPM体系文件管理解决方案分享
一.方案概述 企业管理在很大程度上是通过文件化的形式表现出来,体系文件管理是管理体系存在的基础和证据,是规范企业管理活动和全体人员行为,达到管理目标的管理依据.对与公司质量.环境.职业健康安全等体系有 ...
- PostGIS(解压版)安装
1.软件下载 postgresql-9.6.1-1-windows-x64-binaries.zip https://www.postgresql.org/download/windows/ post ...
- Oracle 11g必须开启的服务及服务详细介绍
转自:http://www.educity.cn/shujuku/404120.html 成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通 ...
- 项目游戏开发日记 No.0x00000
14软二杨近星(2014551622) ---恢复内容开始--- 2016-03-17 从开始迈进软件工程专业, 已经快两年了, 记得当初选择软件的理由是, 我要学去做东西, 我享受开发过程. 两年来 ...
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...
- [httpserver]如何解析HTTP请求报文
这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦. 在上一篇文章中,讲述了如何编写一个最简单的server,但该程序只是接受到请求之后马上返回响应,实在不能更 ...