对于我当前的项目,我正在构建一个带有句柄和内容的下拉视图。 当我通过拖动它移动手柄一切都很好。然后我让它开始动画以完全打开或关闭下拉。
首先:没有动画,一切都很好,但当然不是那么顺利......
所以我为动画添加了这个:
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 但是没有帮助...
答案 0 :(得分:0)
这是因为您在尝试阅读属性顶部时动画“y”属性,并且它们不相同。 顶部是视图相对于其父级的顶部位置。 Y是视图的视觉y位置,相当于translationY +当前的顶级属性。
所以在你的情况下:
像这样动画“顶部”:
ObjectAnimator animHandle = ObjectAnimator.ofFloat(mHandleContainer, "top", 200);
通过
阅读mHandleContainer.getTop()
或“y”:
ObjectAnimator animHandle = ObjectAnimator.ofFloat(mHandleContainer, "y", 200);
通过
阅读mHandleContainer.getY();
答案 1 :(得分:0)
我确实使用基本的ValueAnimator解决了这个问题,每次调用我的自定义绘图方法来移动我的所有视图。