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宽度 * ...
随机推荐
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- sublime常用快捷键
自己觉得比较实用的sublime快捷键: Ctrl + / ---------------------注释 Ctrl + 滚动 --------------字体变大/缩小 Ctrl + N----- ...
- HTML5 localStorage本地存储
介绍 localStorage(本地存储)的使用方式.包括对存储对象的添加.修改.删除.事件触发等操作. 目录 1. 介绍 1.1 说明 1.2 特点 1.3 浏览器最小版本支持 1.4 适合场景 2 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)
系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...
- JQuery easyUI DataGrid 创建复杂列表头(译)
» Create column groups in DataGrid The easyui DataGrid has ability to group columns, as the followin ...
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
- mount报错: you must specify the filesystem type
在linux mount /dev/vdb 到 /home 分区时报错: # mount /dev/vdb /homemount: you must specify the filesystem ty ...
- Git分布式版本控制教程
Git分布式版本控制Git 安装配置Linux&Unix平台 Debian/Ubuntu $ apt-get install git Fedora $ ) $ dnf and later) G ...
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
- 简单酷炫的canvas动画
作为一个新人怀着激动而紧张的心情写了第一篇帖子还请大家多多支持,小弟在次拜谢. 驯鹿拉圣诞老人动画效果图如下 html如下: <div style="width:400px;heigh ...