关于OnGlobalLayoutListener

我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件布局要在onResume回调后完成。所以现在需要使用getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度。这是获得一个view的宽度和高度的方法之一。

OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。

除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:

interfaceViewTreeObserver.OnGlobalFocusChangeListener

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

interfaceViewTreeObserver.OnGlobalLayoutListener

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

interfaceViewTreeObserver.OnPreDrawListener

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

interfaceViewTreeObserver.OnScrollChangedListener

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

interfaceViewTreeObserver.OnTouchModeChangeListener

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

其中,我们可以利用OnGlobalLayoutListener来获得一个视图的真实高度


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

private int mHeaderViewHeight;

private View mHeaderView;

.....

mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(

    new OnGlobalLayoutListener() {

        @Override

        public void onGlobalLayout() {

                                                                                                                                                                                                                                 

            mHeaderViewHeight = mHeaderView.getHeight();

            mHeaderView.getViewTreeObserver()

                    .removeGlobalOnLayoutListener(this);

        }

});

但是需要注意的是OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。另外mHeaderViewHeight和mHeaderView都需要写在当前java文件类(比如Activity)的成员变量中。不能直接在onCreate中定义否则会编译不通过

时间: 2024-10-18 20:46:18

关于OnGlobalLayoutListener的相关文章

Android的Kotlin秘方(I):OnGlobalLayoutListener

春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://antonioleiva.com/kotlin-ongloballayoutlistener/ 原文作者:Antonio Leiva(http://antonioleiva.com/about/) 原文发布:2016-03-16 ­ 今天一位同伴问我怎样恰当使用OnGlobalLayoutListene

监听视图树 OnGlobalLayoutListener

背景 我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们写一个控件 public class MyImageView extends ImageView {     public MyImageView(Context context, AttributeSet attrs) {         super(context, attrs);     }     public MyImageView(Context context) {       

OnGlobalLayoutListener用法

1.implements ViewTreeObserver.OnGlobalLayoutListener{} 2.mContentView.getViewTreeObserver().addOnGlobalLayoutListener(this) [email protected]    public void onGlobalLayout() {} 4.mContentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

九点(九宫格)式手势解锁自定义view

周末闲着没事,写了个手势解锁的view,实现起来也蛮快的,半天多一点时间就完事.把源码和资源贴出来,给大家分享,希望对大家有用. 效果,就跟手机上的九点手势解锁一样,上个图吧: 过程嘛感觉确实没啥好讲的了,涉及的知识以前的博客都说过了,无非就是canva,paint,touch事件这些,画画圆圈画画线条,剩下的就是细节处理逻辑了.都在代码里,所以这里就主要是贴资源吧. 这个自定义view就一个类,源码如下: package com.cc.library.view; import android.

自定义视图之————安卓图库缩放拖拽的完整实现

加了大部分注释,看注释应该可以明白基本的思路.欢迎大神留言拍砖,此文适合小白观看. package com.example.imagedeal; import android.content.Context; import android.graphics.Matrix; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; impor

Android顶部粘至视图详解

不知从某某时间开始,这种效果开始在UI设计中流行起来了,让我们先来看看效果: 大家在支付宝.美团等很多App中都有使用,要实现这个效果,我们可以来分析下思路: 我们肯定要用2个一样的布局来显示我们的粘至布局,一个是正常的.另一个是到顶部不动的,正常的那个,随着scroll一起滚,该滚到哪滚到哪,只是他滚到最上面的时候, 我们需要用粘至的布局,放到顶部,当然,他还在后面继续滚,ok,现在我们来看看具体如何实现: 先看布局,just a demo,用几张图片稍微做做样子. 粘至布局: <?xml v

MediaPlayer 状态机 API 详解 示例

简介 public class android.media.MediaPlayer extends Object implements VolumeAutomation 可能需要的权限: One may need to declare a corresponding(相应) WAKE_LOCK permission <uses-permission> element. <uses-permission android:name="android.permission.WAKE_

Android学习笔记View的工作原理

自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还需要掌握View常见的回调方法.而对于那些具有滑动效果的自定义View,我们还需要处理View的滑动,如果遇到滑动冲突则需要处理相应的滑动冲突. 下面是View的常见回调方法: 构造方法 onAttach onVisibilityChanged onDetach onFinishInflate on

Android11_图片处理

安卓多媒体编程 1,计算机图形的表示方式方法 1.1 ①像素点形式(单色位图),一个像素点相当于1*1个像素,8个像素点就是8个0011占据一个byte的位置,200*200=40000 40000/8 = 5000byte字节 ②24位位图,一个像素点有24位(2的24次方)来表示颜色 ,3个byte.40000*24/8 = 120000byte字节 ③256位图,一个像素点占256色,为(2的8次方),一个byte.40000byte就可以表示. 1.2 矢量图形:储存的是指令,而不是像素