Android视图动画失去了视图位置

时间:2013-06-27 10:12:06

标签: android android-layout android-animation

对于我当前的项目,我正在构建一个带有句柄和内容的下拉视图。 当我通过拖动它移动手柄一切都很好。然后我让它开始动画以完全打开或关闭下拉。

首先:没有动画,一切都很好,但当然不是那么顺利......

所以我为动画添加了这个:

    ObjectAnimator animHandle = ObjectAnimator.ofFloat(mHandleContainer, "y", newHandlePosition);
    ObjectAnimator animContent = ObjectAnimator.ofFloat(mContent, "y", newContentPosition);
    final AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(animHandle, animContent);
    animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
    animatorSet.setDuration(MAX_ANIMATION_DURATION);
    animatorSet.start();

这里的一切都很好。

但是,当我再次按下手柄(mHandleContainer)时,我想知道手柄的位置,所以我做了

    mHandleContainer.getTop()

这就是出错的地方。 当我初始化自定义组件时,我将句柄的顶部设置为0。 到目前为止这么好,然后我开始拖动,当我放手时,我看到我将动画到1134像素的位置。这很好(意味着下拉将完全打开)。

然后我再次按下手柄并获得顶部(getTop()),它仍然返回0。

我想要的是我的视图的getTop()函数再次返回1134。

这可能吗?

或者我应该在AnimatorListener的onAnimationEnd方法中做些什么? 我已经尝试在那里做一个mHandleContainer.layout(..),然后我的getTop()没问题,但是我的布局搞砸了......

这里的技巧是让动画以正确的位置结束(就像它一样)并在视图中保持位置?

我已经看过SO(和谷歌),但没有找到有用的东西。我能找到的唯一接近我问题的是:NineOldAndroids, not clickable view after rotation or move 但是没有帮助...

2 个答案:

答案 0 :(得分:0)

这是因为您在尝试阅读属性顶部时动画“y”属性,并且它们不相同。 顶部是视图相对于其父级的顶部位置。 Y是视图的视觉y位置,相当于translationY +当前的顶级属性。

所以在你的情况下:

  1. 像这样动画“顶部”:

    ObjectAnimator animHandle = ObjectAnimator.ofFloat(mHandleContainer, "top", 200);
    

    通过

    阅读
    mHandleContainer.getTop()
    
  2. 或“y”:

    ObjectAnimator animHandle = ObjectAnimator.ofFloat(mHandleContainer, "y", 200);
    

    通过

    阅读
    mHandleContainer.getY();
    

答案 1 :(得分:0)

我确实使用基本的ValueAnimator解决了这个问题,每次调用我的自定义绘图方法来移动我的所有视图。