了解getViewTreeObserver

时间:2018-09-25 08:57:56

标签: java android

首先,让我道歉,但是我不知道还有什么要问的。

我想了解以下可能是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,所以我不明白为什么要先设置然后再删除。如果我将yAnimationxAmination行从此侦听器中取出,并且仅自己运行它们,则代码仍然可以正常工作,但是不会返回其原始X和Y。但是我没有了解上面的代码为何允许createSpringAnimation函数接收正确 X和Y。

请,有人可以帮我理解吗?

1 个答案:

答案 0 :(得分:1)

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