文档章节

view变化监听器ViewTreeObserver介绍

李光正
 李光正
发布于 2015/10/15 14:53
字数 925
阅读 9
收藏 0
点赞 0
评论 0

A view tree observer is used to register listeners that canbe notified of global changes in the view tree. Such global eventsinclude, but are not limited to, layout of the whole tree,beginning of the drawing pass, touch mode change.... AViewTreeObserver should never be instantiated by applications as itis provided by the views hierarchy. Refer toView.getViewTreeObserver() for moreinformation.

从上面的描述中,不难看出,ViewTreeObserver是用来帮助我们监听某些View的某些变化的。

 

在 ViewTreeObserver 中,包含了以下几个接口:

interfaceViewTreeObserver.OnGlobalFocusChangeListener

interfaceViewTreeObserver.OnGlobalLayoutListener

interface ViewTreeObserver.OnPreDrawListener

interfaceViewTreeObserver.OnScrollChangedListener

interfaceViewTreeObserver.OnTouchModeChangeListener

本文将测试除 ViewTreeObserver.OnScrollChangedListener外的四个接口

 

1.    创建一个 Android Project ,修改 main.xml 使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"

android:id = "@+id/full_screen"

   android:orientation= "vertical"

   android:layout_width= "fill_parent"

   android:layout_height= "fill_parent"

>  

   

   < TextView

                  android:id = "@+id/tv_show"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

           android:textSize = "32px"

           android:textColor = "#FFFF00"

   />

   

   < EditText

   android:id = "@+id/ed_enter1"

   android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

        />

        

   < EditText

   android:id = "@+id/ed_enter2"

   android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

        />

        

        < TextView

                  android:id = "@+id/tv_display"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

   />

   

        < Button

                  android:id = "@+id/button"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = "OK"

   />    

</ LinearLayout >

注意:给 layout 增加一个 id : full_screen

 

2.    Activity 对应的 Java 代码如下:

public class ControlViewTreeObserver extends Activity

implements

OnClickListener,

ViewTreeObserver.OnTouchModeChangeListener,          // 用于监听 Touch 和非 Touch 模式的转换

ViewTreeObserver.OnGlobalLayoutListener,                     // 用于监听布局之类的变化,比如某个空间消失了

ViewTreeObserver.OnPreDrawListener,                              // 用于在屏幕上画 View 之前,要做什么额外的工作

ViewTreeObserver.OnGlobalFocusChangeListener         // 用于监听焦点的变化

{

        private TextView tv_show ;

   private ViewTreeObserver vto ;

   private View all ;

   

   private EditText ed1 ;

   private EditText ed2 ;   

   private TextView tv_display ;

   private Button button ;

   private boolean btnClicked ;

   

   @Override

   public void onCreate(Bundle savedInstanceState)

   {

       super .onCreate(savedInstanceState);

       setContentView(R.layout. main );

       

       tv_show = (TextView) this .findViewById(R.id. tv_show );

       all = this .findViewById(R.id. full_screen );                                 // 得到整个屏幕对象 , 因为顶层 layout 的 width 和 height 都是 fill_parent

       vto = (ViewTreeObserver) all .getViewTreeObserver();         // 通过 getViewTreeObserver 获得 ViewTreeObserver 对象

       

       tv_display = (TextView) this .findViewById(R.id. tv_display );

       ed1 = (EditText) this .findViewById(R.id. ed_enter1 );

       ed2 = (EditText) this .findViewById(R.id. ed_enter2 );

       button = (Button) this .findViewById(R.id. button );

       button .setOnClickListener( this );

       

       vto .addOnTouchModeChangeListener( this );                         // 增加对应的 Listener

       vto .addOnGlobalFocusChangeListener(this );                       // 增加对应的 Listener

       vto .addOnPreDrawListener( this );                                              // 增加对应的 Listener

       vto .addOnGlobalLayoutListener( this );                                     // 增加对应的 Listener

   }

 

   // onTouchModeChanged 是接口 ViewTreeObserver.OnTouchModeChangeListener

   // 中定义的方法。

        @Override

        public void onTouchModeChanged( boolean isInTouchMode)

        {

                  if (isInTouchMode) tv_show .setText( "In touch mode" );

                  else tv_show .setText( "Not in touch mode" );

        }

 

        // onGlobalLayout 是接口 ViewTreeObserver.OnGlobalLayoutListener

        // 中定义的方法。

        // Callback method to be invokedwhen the global layout state or the

        // visibility of views within the view treechanges

        @Override

        public void onGlobalLayout()

        {

                  if ( btnClicked )

                  {

                           if (! ed2 .isShown())

                                    ed1 .setText( " 第二个 EditText 不见了 " );

                           else

                                    ed1 .setText( " 第二个 EditText 出来了 " );

                  }

        }

 

        // onPreDraw 是接口 ViewTreeObserver.OnPreDrawListener

       // 中定义的方法。

        @Override

        public boolean onPreDraw()

        {

                  // 在屏幕上画出 ed1 控件之间 , 给它增加一个提示 , 并改变其字体大小

                  ed1 .setHint( " 在 onPreDraw 方法中增加一个提示信息 " );

                  ed1 .setTextSize(( float ) 20.0);

                  

                  //return false;   // Return true to proceed with the current drawing pass, or falseto cancel.

                  return true ;       // 如果此处不返回 true , 则整个界面不能完整显示。

        }                                            

 

        // 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());

                  }

        }

 

        @Override

        public void onClick(View v)

        {

                  // 改变 ed2 的可见性 , 会触发 onGlobalLayout 方法的执行

                  btnClicked = true ;

                  if (v.getId() == R.id. button )

                  {

                           if ( ed2 .isShown())

                                    ed2 .setVisibility(View. INVISIBLE );

                           else

                                    ed2 .setVisibility(View. VISIBLE );

                  }

        }

}
 

3.    运行结果:

 

 

 

可以看到第一个 EditText 中存在字体发生了变化的提示信息,这种效果是在 onPreDraw() 方法中实现的。

用鼠标点击屏幕上的第二个 EditText ,

 

 


 

有两个变化:

一个是有 Not in touch mode 变成了 In touch mode ,二是显示了焦点变化方面的信息。它们分别是 onTouchModeChanged 和 onGlobalFocusChanged 这两个方法所输出的信息。

 

如果用模拟器右边的键盘进行操作,将交掉移动到第一个 EditText ,则又会回到 Not in touch mode 的状态。

 

点击 OK 按钮,改变第二个 EditText 的可见性:

 


 

第一个 EditText 中的内容是在 onGlobalLayout 方法中设定的。


本文转载自:http://blog.csdn.net/liguangzhenghi/article/details/8076121

共有 人打赏支持
李光正
粉丝 5
博文 64
码字总数 0
作品 0
大兴
关于Android中的ViewTreeObserver

ViewTreeObserver结构 extends Objectjava.lang.Object↳ android.view.ViewTreeObserver ViewTreeObserver概述 A view tree observer is used to register listeners that can be notified ......

街角的小丑
04/27
0
0
Android 3.0 r1中文API文档(104) —— ViewTreeObserver

一、结构 public final class ViewTreeObserver extends Object java.lang.Object android.view.ViewTreeObserver 二、概述     用于注册监听的视图树观察者(observer),在视图树种全局事...

walb呀
2017/12/05
0
0
CoordinatorLayout Behavior一些笔记

最近因为需要研究一个滑动悬浮效果,偶然间发现了CoordinatorLayout这个很强大的布局,这个控件一般需要配合AppBarLayout、CollapsingToolbarLayout使用来实现一些悬浮和渐变的高级效果,相关...

HumorousMan
2017/06/07
0
0
Android绘图监听接口OnPreDrawListener详解

public static interface ViewTreeObserver.OnPreDrawListener 我们先看下API中的定义: 类概述: 为即将绘制视图树时执行的回调函数定义的接口. 共有方法: public abstract boolean onPreD...

eclipse_xu
2014/10/12
0
0
人人都会设计模式---观察者模式--Observer

观察者模式大纲 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/b972ba509… 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,老手直...

TigerChain
2017/11/28
0
0
06、观察者模式--Observer

观察者模式大纲 以后文章会第一时间发在公号,请大家添加博文的公号,扫描添加即可关注 公众号:TigerChain TigerChain PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/...

TigerChain
2017/11/27
0
0
android 动态改变图片大小

在oncreate中,使用getheight等函数不能获得控件大小,得到的为0 应使用其他方法 Resources res = getResources(); final ImageView view=(ImageView)findViewById(R.id.IV_about); final D......

elvvvin
2014/08/15
0
0
ViewTreeObserver简介

/**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。   * 参数 listener 将要被添加的回调函数   *异常 IllegalStateException 如果isAlive() 返回false   */...

鲜鲜
2014/08/27
0
0
Android两层布局,键盘弹出时,底层保持不动,上层顶上去

参考项目KeyboardVisibilityEvent 1、AndroidManifest.xml中activity不设置android:windowSoftInputMode属性或者设置为adjustUnspecified 2、修改过后的KeyboardVisibilityEvent代码 3、布局......

GalaxyBruce
2016/08/12
42
0
iOS 之 MVC 开发模式

iOS 应用程序开发时,需对Cocoa Touch 的几种设计模式有所了解。 iOS 开发一定要掌握的设计模式: Target Action Design Pattern; Notification Pattern MVC Pattern KVO (Key-Value Obser...

hejunbinlan
2016/01/12
72
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
14分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
15分钟前
0
0
TensorFlow 拟合异或 one-hot方式

增加隐含层数目 之前是按照计算出的数值按照0.5分为0和1,现在是算出向量,用维度较大的作为结果 import tensorflow as tfimport numpy as np# 网络结构:2维输入 --> 2维隐藏层 --> ...

阿豪boy
17分钟前
0
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
33分钟前
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
50分钟前
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
58分钟前
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
59分钟前
0
0
Linux sar性能分析

Linux使用sar进行性能分析 sar简介 sar命令常用格式 sar常用性能数据分析 整体CPU使用统计-u 各个CPU使用统计-P 内存使用情况统计-r 整体IO情况-b 各个IO设备情况-d 网络统计-n sar日志保存-...

易野
今天
0
0
用 Python 实现打飞机,让子弹飞吧!

所用技术和软件 python 2.7 pygame 1.9.3 pyCharm 准备工作 安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。 下载好使用的素材。 技术实现 初始化 pygame 首先要...

猫咪编程
今天
0
0
MySQL的行锁和表锁

简单总结一下行锁和表锁。 行锁 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁 每次操作锁住整张表。开销小,加锁快;不会出...

to_ln
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部