获取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攻略][001][Ubuntu安装及配置]
root登入配置 1.sudo passwd root 2.su - root 3.vim /etc/lightdm/lightdm.conf [SeatDefaults] user-session= ...
- [国嵌笔记][031][Bootloader架构设计]
- STM32小结
1.GPIO 电灯 推挽输出 PB5 2.GPIO 按键 浮空输入 PA0 3.写IO高电平 HAL_GPIO_WritePin(GPIOB,GPIO_Pin_5,1); 4.读取IO电平 HAL_G ...
- DEDECMS去掉自动生成首页或栏目后面带的index.html
Dede默认生成首页后,首页的链接后面会多出一个index.html.据官方说法这样有利于网站优化.但是这个index.html怎么看都不舒服,而且也不利于seo中主页url的统一.因为我的网站的ur ...
- destoon_笔记
{mb_substr($shop_type[catname],0,4)} {dsubstr($v['company'],18)} =================================== ...
- css3图片动画旋转
body{ background-color:#021E36; text-align: center; } .container{margin:500px auto;} .round{position ...
- VisualSFM+PMVS生成稠密点云
利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...
- 5dfda1332b67817b0f2d7839242021ce'Java数据结构和算法
1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...
- CentOS7中使用iptables
原文地址:http://blog.csdn.net/u012486840/article/details/53161555 1.关闭firewall: systemctl stop firewalld ...
- JSTL遇到的问题
1.jstl 中不可以用关键字命名 例如class new. 2.jstl取值的问题 如果jstl通过对象.属性取值 属性值中包括特殊字符(例如:31/20180131195356867.txt&qu ...