android点滴之ViewTreeObserver

一类的基本概念

这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知。这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等。最常见的用途时通过监听获知什么时候,视图的宽高值确定了,可以获取了,以便更改UI。

二类的主要接口:监听器

interface  ViewTreeObserver.OnGlobalFocusChangeListener

当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类

interface  ViewTreeObserver.OnGlobalLayoutListener

当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类

interface  ViewTreeObserver.OnPreDrawListener

当一个视图树将要绘制时,所要调用的回调函数的接口类

interface  ViewTreeObserver.OnScrollChangedListener

当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类

interface  ViewTreeObserver.OnTouchModeChangeListener

当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类

三代码示例

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

android点滴之ViewTreeObserver

时间: 2024-12-24 20:36:57

android点滴之ViewTreeObserver的相关文章

android点滴之ContentObserver的使用

一概念 ContentObserver用于观察(捕捉)特定Uri引起的数据的变化,继而做一些对应的处理,当ContentObserver所观察的Uri发生变化时,便会触发它. 从概念看ContentObserver特别适合用于监视系统数据的变化,比方数据库发生了修改,或者其它不论什么已经在UriMatcher类注冊过的Uri,比方:Settings.System.ACCELEROMETER_ROTATION,能够监视系统屏幕的方向. 二使用 1.创建 mObserver = new Conten

android点滴之标准SD卡状态变化事件广播接收者的注册

目前最完整的,需要注册的动作匹配如下: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); intentFilter.addAction(Intent.ACTION_ME

android点滴之HandlerThread的用法

bochs调试的有些命令根据版本好像有变化,我在ubuntu下安装了bochs-2.4.6,发现和bochs-2.3.6命令出现区别,在2.3.6版本支持dump_cpu.info r等命令,在我安装的2.4.6版本中不支持这两个命令,后面在使用bochs的过程中会陆续总结一些2.4.6支持的命令,最简单的方法是通过help来获取,下面先记录一些常用的: r 查看通用寄存器 sreg 查看段寄存器(IDTR被归到这里) creg 查看系统寄存器(CR0等) x 查看内存(线性地址) xp 查看内

android点滴之触控相关知识点(持续更新)

1.检查当前屏幕有多少个触摸点. 使用MotionEvent的getPointerCount()方法. 2.多点触控下,触摸的状态的检测 MotionEvent类中方法getActionMasked(),这个方法可以检查触摸的状态: 当只有一个触摸点时(只用一根手指触摸屏幕),按下是0,起来是1,移动是2: 当触摸点多于1时(多根手指触摸屏幕),按下是5,起来是6,移动是2: 3.多点触控下,每个触点的分类处理 多点触摸时 假如是第i个点 int x = event.getX(i); int y

Android点滴---AndroidAnnotations java.lang.ClassNotFoundException

今天在网上找资料, 下载了一个Demo, 运行时报: Caused by: java.lang.ClassNotFoundException: Didn't find class "net.mobctrl.listviewdemo.MainActivity_" on path: DexPathList[[zip file "/data/app/net.mobctrl.listviewdemo-2.apk"], nativeLibraryDirectories=[/d

关于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

android点滴之PendingIntent的使用

一概念 PendingIntent就是一个能够在满足一定条件下运行的Intent,它相比于Intent的优势在于自己携带有Context对象.这样他就不必依赖于某个activity才干够存在. 它和Intent的主要差别在于Intent的运行立马的,而pendingIntent的运行不是立马的.pendingIntent运行的操作实质上是參数传进来的Intent的操作.可是使用pendingIntent的目的在于它所包括的Intent的操作的运行是须要满足某些条件的. 二实质 PendingIn

Android点滴---ViewHolder通用,优雅写法

近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章(感谢分享! ): ViewHolder超简洁写法 点击跳转 优雅的使用ViewHolder 点击跳转 然后自己整理的了, 保存起来.省的忘记.顺便分享一下! 直接贴代码了: 第一种: import android.util.SparseArray; import android.view.View;

android点滴记录1

1.EditText 中的光标位置调整 Android 的 EditText 控件默认获取焦点的时候, 插入光标是在第一个位置的,如果EditText中设置了文本, 这个时候光标是在文本的最前面, 而不是文本的最后. 为了方便用户使用, 需要把光标移动到文本最后, 但是EditText 没有提供 setCursor 函数.  经查看其文档 发现 setSelection 函数可以完成该功能. 如下: EditText et = ... 02. String text = "text";