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宽度 * ...
随机推荐
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- .net Elasticsearch 学习入门笔记
一. es安装相关1.elasticsearch安装 运行http://localhost:9200/2.head插件3.bigdesk插件安装(安装细节百度:windows elasticsear ...
- .Net Core上也可以使用的二维码组件
我Fork了QRCoder,并且兼容了.Net Core,图形库用的是ZKWeb.System.Drawing Github: https://github.com/zkweb-framework/Q ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- eclipse — 导入android项目后识别成java项目的问题及解决
最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...
- Android中的flexboxlayout布局
提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...
- Win7安装MySQL-5.7.16过程
1.在C盘新建MYSQL文件夹:2.将mysql-5.7.16-winx64拷贝到C:\MYSQL文件夹下,更名为mysql-5.7.16:3.在mysql-5.7.16目录下,建my.ini文件,内 ...
- Oozie分布式任务的工作流——Spark篇
Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark.在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任务,合理的设计工作流并分配适合的参数对于 ...
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...