代码之家  ›  专栏  ›  技术社区  ›  Chud37

了解GetViewTreeObserver

  •  0
  • Chud37  · 技术社区  · 6 年前

    首先,让我重复一下,但我不知道还能问什么。

    我想了解以下代码 found here.

    除此之外,我完全理解 getViewTreeObserver 比特:

    movingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            yAnimation = createSpringAnimation(movingView,SpringAnimation.Y, movingView.getY(), STIFFNESS, DAMPING_RATIO);
            xAnimation = createSpringAnimation(movingView,SpringAnimation.X, movingView.getX(), STIFFNESS, DAMPING_RATIO);
            movingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });
    

    为什么我们需要这个?最后一行,删除 OnGlobalLayoutListener movingView ,所以我不明白我们为什么设置它然后移除它。如果我接受 yAnimation xAmination 从这个监听器中取出行,然后自己运行它们,代码仍然可以正常工作,但是它不会返回到原来的x和y。 createSpringAnimation 接收的函数 对的 X和Y.

    拜托,有人能帮我理解吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   kingston    6 年前

    Android需要时间来布局 View 在您的布局中。如果您试图直接读取视图的任何参数,通常会得到0或框架在计算正确值之前使用的任何默认值。 由于此操作是异步的,因此需要注册一个侦听器,以便在布局就绪时得到通知。然后,当然,您可以读取这些值并删除监听器,因为它不再是必需的。 但是要小心,因为有时会多次调用侦听器,所以在使用值之前和注销侦听器之前,请检查您是否确实成功地读取了有意义的值。