获取View组件宽度以及ViewTreeObserver
View宽高测量方法:
测量方法有三种,如下:
1)(直接在onCreate()执行)
int w = View.MeasureSpec.makeMeasureSpec(,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(,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
//当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类 interface ViewTreeObserver.OnGlobalLayoutListener
//当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类 interface ViewTreeObserver.OnPreDrawListener
//当一个视图树将要绘制时,所要调用的回调函数的接口类 interface ViewTreeObserver.OnScrollChangedListener
//当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类 interface ViewTreeObserver.OnTouchModeChangeListener
//当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
四、公共方法
/**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
* 参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener) /**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
/**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)
/**注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener listener)
/**注册一个回调函数,当一个触摸模式发生改变时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void addOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener listener)
//当整个布局发生改变时通知相应的注册监听器。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在GONE状态下,它可以被手动的调用
public final void dispatchOnGlobalLayout () /**当一个视图树将要绘制时通知相应的注册监听器。如果这个监听器返回true,则这个绘制将被取消并重新计划。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在一个GONE状态下,它可以被手动的调用
*返回值 当前绘制能够取消并重新计划则返回true,否则返回false。
*/
public final boolean dispatchOnPreDraw () /**指示当前的ViewTreeObserver是否可用(alive)。当observer不可用时,任何方法的调用(除了这个方法)都将抛出一个异常。如果一个应用程序保持和ViewTreeObserver一个历时较长的引用,它应该总是需要在调用别的方法之前去检测这个方法的返回值。
*返回值 但这个对象可用则返回true,否则返回false
*/
public boolean isAlive () /**移除之前已经注册的全局布局回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
/**移除之前已经注册的焦点改变回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void removeOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener victim)
/**移除之前已经注册的预绘制回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void removeOnPreDrawListener (ViewTreeObserver.OnPreDrawListener victim)
/**移除之前已经注册的滚动改变回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void removeOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener victim)
/**移除之前已经注册的触摸模式改变回调函数
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
public void removeOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener victim)
五、代码示例
1、创建监听器
private final ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = -;
int height = -;
try {
width = getActivity().getWindow().getDecorView().getWidth();
height = getActivity().getWindow().getDecorView().getHeight();
} catch (Exception e) {
// called too early. so, just skip.
}
if (width != - && mGlobalLayoutWidth != width) {//只有当尺寸真正有了数值,即已经确定了,更新UI才有意义
mGlobalLayoutWidth = width;
updateUI();
} else if (height != - && mGlobalLayoutHeight != height) {
mGlobalLayoutHeight = height;
updateUI();
} } };
2、一般在onCreate或onCreateView中注册监听器
mViewTreeObserver = getActivity().getWindow().getDecorView().getViewTreeObserver();
mViewTreeObserver.addOnGlobalLayoutListener(mGlobalLayoutListener);
获取View组件宽度以及ViewTreeObserver的更多相关文章
- android笔记:获取View组件宽度以及ViewTreeObserver
View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureS ...
- Android 开发 Activity里获取View的宽度和高度 转载
原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...
- HackThirteen 在onCreate()方法中获取View的宽度和高度
1.概要: Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出: 如果开发一些依赖于UI控件的宽和高的功 ...
- Activity中获取view的高度和宽度为0的原因以及解决方案
在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得 ...
- 监听视图树 ViewTreeObserver 获取View的宽高
前奏:在哪里可以获取到View的宽高 我们知道,在onCreate方法执行完毕以后,View才开始被测量,所以我们在onCreate方法里面通过view.getWidth()或view.getMeas ...
- [Flex] 动态获取组件宽度和高度
flex中我们有时并不想一开始就设置某个组件的宽度和高度,而想动态获取某个组件经填充后的width和height,但是会发现width和height均为0,这时我们可以注册一下两个事件之一来解决. i ...
- Android 获取View宽度
/***************************************************************************** * Android 获取View宽度 * ...
- 如何在onCreate中获取View的高度和宽度
如何在onCreate中获取View的高度和宽度 原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&mid=2247483676&am ...
- Android必知必会-获取View坐标和长宽的时机
如果移动端访问不佳,请访问–>Github版 背景 最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下: 这里我使用的是DialogFragment来实现的,可以 ...
随机推荐
- [学习OpenCV攻略][003[初试牛刀——显示图片]
cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...
- TF-IDF_MapReduceJava代码实现思路
TF-IDF 1. 概念 2. 原理 3. java代码实现思路 数据集: 三个MapReduce 第一个MapReduce:(利用ik分词器,将一篇博文,也就是一条记录 ...
- 算法-java代码实现堆排序
堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...
- HTML 5 video 视频标签全属性详解
http://www.cnblogs.com/kiter/archive/2013/02/25/2932157.html 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theor ...
- ThinkPhp 添加模型类
----------------------------------------------- <?phpnamespace app\common\model;use traits\model\ ...
- ios VS android
本来是学习IOS的,但是最近接到的是有关于安卓的项目,害怕弄混,所以在这个技术博客里写一下对比. IOS ...
- Flex: Holy Grail
Flex:Holy Grail <html> <head> <style type="text/css"> body,div,header,ma ...
- Java调用阿里云短信通道服务【千锋】
这里我们使用SpringBoot 来调用阿里通信的服务. 阿里通信,双11.收到短信,日发送达6亿条.保障力度非常高. 使用的步骤: 1.1. 第一步:需要开通账户 1.2. 第二步:阅读接口文档 1 ...
- 《Java编程的逻辑》终于上市了!
2018年1月下旬,<Java编程的逻辑>终于出版上市了! 这是老马过去两年死磕到底.无数心血的结晶啊! 感谢"博客园"的广大读者们,你们对老马文章的极高评价.溢美之词 ...
- Hive环境搭建
hive 环境搭建需要hadoop的环境.hadoop环境的搭建不在这里赘述.参考:http://www.cnblogs.com/parkin/p/6952370.html 1.准备阶段 hive 官 ...