【问题标题】:Understanding getViewTreeObserver了解 getViewTreeObserver
【发布时间】:2018-09-25 17:46:59
【问题描述】:

首先,让我道歉,但我不知道还能问哪里。

想看懂下面的代码可以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);
    }
});

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

拜托,谁能帮我理解一下?

【问题讨论】:

标签: java android


【解决方案1】:

Android 需要时间在您的布局中布置 Views。如果您尝试立即读取 View 的任何参数,通常会得到 0 或框架在设法计算正确值之前使用的任何默认值。 由于此操作是异步的,因此您需要注册一个侦听器,以便在布局准备好时收到通知。然后,当然,您可以读取值并删除侦听器,因为不再需要了。 不过要小心,因为有时会多次调用侦听器,因此在使用值之前和注销侦听器之前,请检查您是否真的设法读取了有意义的值。

【讨论】:

  • 谢谢 - 这真的很有帮助。那么如何检查有意义的值 - 我猜任何不是 0.0f 的值?
  • 是的,我通常只检查这些值是否非零
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2020-09-18
  • 2011-01-07
  • 2016-07-15
  • 2012-02-28
  • 2012-09-22
  • 2010-09-29
相关资源
最近更新 更多