首页 > 解决方案 > 了解 getViewTreeObserver

问题描述

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

我想了解可以在此处找到的以下代码。

除了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,所以我不明白为什么我们设置它然后删除它。如果我从这个监听器中取出yAnimationandxAmination行,然后自己运行它们,代码仍然可以正常工作,但是它不会返回到原来的 X 和 Y。但我不明白为什么上面的代码允许createSpringAnimation函数接收正确的X 和 Y。

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

标签: javaandroid

解决方案


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


推荐阅读