关于Android中的ViewTreeObserver
ViewTreeObserver结构
extends Object
java.lang.Object
↳ android.view.ViewTreeObserver
ViewTreeObserver概述
A view tree observer is used to register listeners that can be notified of global changes in the view tree.
Such global events include, but are not limited to, layout of the whole tree, beginning of the drawing pass, touch mode change....
A ViewTreeObserver should never be instantiated by applications as it is provided by the views hierarchy.
Refer to getViewTreeObserver() for more information.
这个观察者用来监听视图树,会监听视图树发生全局变化时发出的通知。这里指的全局事件包括而且不局限在以下几个:整个视图树的布局变化,开始绘制视图,触摸模式改变等等。
ViewTreeObserver是不能被应用程序实例化的,因为它是由视图提供的,通过view.getViewTreeObserver()获取。详情需要查看getViewTreeObserver()方法。
注:简单的说,这是个view事件的观察者。要注意的是它的初始化就是调用View.getViewTreeObserver()。
ViewTreeObserver内部类
| interface | ViewTreeObserver.OnDrawListener |
Interface definition for a callback to be invoked when the view tree is about to be drawn. 当在一个视图树绘制时,所要调用的回调函数的接口类 注:Unlike with |
| interface | ViewTreeObserver.OnGlobalFocusChangeListener |
Interface definition for a callback to be invoked when the focus state within the view tree changes. 当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类 |
| interface | ViewTreeObserver.OnGlobalLayoutListener |
Interface definition for a callback to be invoked when the global layout state or the visibility of views within the view tree changes. 当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类 |
| interface | ViewTreeObserver.OnPreDrawListener |
Interface definition for a callback to be invoked when the view tree is about to be drawn. 当一个视图树将要绘制时,所要调用的回调函数的接口类 |
| interface | ViewTreeObserver.OnScrollChangedListener |
Interface definition for a callback to be invoked when something in the view tree has been scrolled. 当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类 |
| interface | ViewTreeObserver.OnTouchModeChangeListener |
Interface definition for a callback to be invoked when the touch mode changes. 当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类 |
ViewTreeObserver公共方法
1.public void addOnDrawListener (ViewTreeObserver.OnDrawListener listener)
/**注册一个回调函数,当在一个视图树绘制时调用这个回调函数。
* 参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
2.public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener)
/**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
* 参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
3.public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
/**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
4.public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)
/**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
5.public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener listener)
/**注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
6.public void addOnTouchModeChangeListener (ViewTreeObserver.OnTouch3.监听焦点的变化ModeChangeListener listener)
/**注册一个回调函数,当一个触摸模式发生改变时调用这个回调函数。
*参数 listener 将要被添加的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
7.public final void dispatchOnDraw ()
//告知相应监听器,视图绘制开始了
8.public final void dispatchOnGlobalLayout ()
//当整个布局发生改变时通知相应的注册监听器。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在GONE状态下,它可以被手动的调用
9.public final boolean dispatchOnPreDraw ()
/**当一个视图树将要绘制时通知相应的注册监听器。如果这个监听器返回true,则这个绘制将被取消并重新计划。如果你强制对视图布局或者在一个没有附加到一个窗口的视图的层次结构或者在一个GONE状态下,它可以被手动的调用
*返回值 当前绘制能够取消并重新计划则返回true,否则返回false。
*/
10.public boolean isAlive ()
/**指示当前的ViewTreeObserver是否可用(alive)。当observer不可用时,任何方法的调用(除了这个方法)都将抛出一个异常。如果一个应用程序保持和ViewTreeObserver一个历时较长的引用,它应该总是需要在调用别的方法之前去检测这个方法的返回值。
*返回值 但这个对象可用则返回true,否则返回false
*/
11.public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
/**移除之前已经注册的全局布局回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
12.public void removeOnDrawListener (ViewTreeObserver.OnDrawListener victim)
/**移除之前已经注册的视图绘制回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
13.public void removeOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener victim)
/**移除之前已经注册的焦点改变回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
14.public void removeOnPreDrawListener (ViewTreeObserver.OnPreDrawListener victim)
/**移除之前已经注册的预绘制回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
15.public void removeOnScrollChangedListener (ViewTreeObserver.OnScrollChangedListener victim)
/**移除之前已经注册的滚动改变回调函数。
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
16.public void removeOnTouchModeChangeListener (ViewTreeObserver.OnTouchModeChangeListener victim)
/**移除之前已经注册的触摸模式改变回调函数
*参数 victim 将要被移除的回调函数
*异常 IllegalStateException 如果isAlive() 返回false
*/
ViewTreeObserver具体示例
1.在OnCreate()中获取控件高度与宽度
ViewTreeObserver observer = view.getViewTreeObserver();
observer .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
final int w = view.getMeasuredWidth();
final int h = view.getMeasuredHeight();
}
});
但是需要注意的是OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。
2.启动帧动画
OnPreDrawListener opdl=new OnPreDrawListener(){
@Override
public boolean onPreDraw() {
animDraw.start();
return true;
}
};
//onCreate方法中
imageV.getViewTreeObserver().addOnPreDrawListener(opdl);
3.监听焦点的变化
// onGlobalFocusChanged 是接口 ViewTreeObserver.OnGlobalFocusChangeListener
// 中定义的方法。
// 焦点发生变化时,会触发这个方法的执行
@Override
public void onGlobalFocusChanged(View oldFocus, ViewnewFocus)
{
if (oldFocus != null && newFocus!= null )
{
tv_display .setText( "Focus /nFROM:/t" + oldFocus.toString() + "/n TO:/t" + newFocus.toString());
}
}
需要注意的是,布局中的任何一个view添加了这个监听,该布局的任意控件的焦点变化都能够监听的到。
关于Android中的ViewTreeObserver的更多相关文章
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- 【Android归纳】回调机制在Android中的应用与实战
回调这样的思想在程序中是比較普遍的.有时候可能我们并没有注意到.近期整理了一些对于回调的理解,分享给大家 先上概念...... 什么是回调函数? 回调函数就是一个通过函数指针调用的函数. 假设你把函数 ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...
- Android中的LinearLayout布局
LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了, 线性布局是按照垂直方向(vertical)或水平方向 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
随机推荐
- 警告"System.Configuration.ConfigurationSettings.AppSettings”已过时,解决办法
解决办法: 直接把ConfigurationSettings写成ConfigurationManager,但是提示没有ConfigurationManager语句.
- LeetCode记录之21——Merge Two Sorted Lists
算法和数据结构这东西,真的是需要常用常练.这道看似简单的链表合并题,难了我好几个小时,最后还是上网搜索了一种不错算法.后期复习完链表的知识我会将我自己的实现代理贴上. 这个算法巧就巧在用了递归的思想, ...
- CF E2 - Array and Segments (Hard version) (线段树)
题意给定一个长度为n的序列,和m个区间.对一个区间的操作是:对整个区间的数-1可以选择任意个区间(可以为0个.每个区间最多被选择一次)进行操作后,要求最大化的序列极差(极差即最大值 - 最小值).ea ...
- [转] Java运行时动态生成class的方法
[From] http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编 ...
- b站弹幕的爬取以及词云的简单使用
一.B站弹幕的爬取 1.分析发现,其弹幕都是通过list.so?=cid这个文件加载出来的,所以我们找到这个文件的请求头的请求url, 2. 打开url就能看到所有的评论 3. 上代码,解析 #!/u ...
- 今日工作总结:jquery轮转效果的集成与前台页面banner的设计思路总结
今日做了两个项目中的两个问题,现在特来总结一下,以便分享给更多的朋友们. 1.jquery轮转效果的集成 涉及到jquery的不同版本问题,解决办法是在后缀用jQuery代替$.项目地址在:121.4 ...
- groovy——运行方式、基本语法、引入方式、metaClass
jvm运行groovy类有两种方式: 1.使用groovyc编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. ...
- API-Framework 前后端分离
- VUE中toast的使用与开发
在这篇文章中介绍了toast是什么,这篇文章主要介绍toast的开发与使用. 开发 Vuejs很流行,并且官方也给出了路由插件vue-router.数据管理插件vuex,但是我们仅仅停留在了使用的阶段 ...
- bzoj 5302: [Haoi2018]奇怪的背包
Description Solution 首先 \(v_1,v_2,v_3...v_n,P\) 能够构成的最小数是 \(gcd(P,v_1,v_2,v_3...v_n)\) 然后 \(gcd(P,v_ ...