我正在尝试在屏幕上制作卡片动画。
我的代码是这样的:
private void animate(ImageView animationSource, ImageView animationTarget, int animationDuration, int animationDelay) {
int[] animationSourcePosition = {0,0};
int[] animationTargetPosition = {0,0};
animationSource.getLocationInWindow(animationSourcePosition);
animationTarget.getLocationInWindow(animationTargetPosition);
TranslateAnimation cardDealingAnimation = new TranslateAnimation(
Animation.ABSOLUTE,animationSourcePosition[0],
Animation.ABSOLUTE,animationTargetPosition[0],
Animation.ABSOLUTE,animationSourcePosition[1],
Animation.ABSOLUTE,animationTargetPosition[1]);
cardDealingAnimation.setDuration(animationDuration);
cardDealingAnimation.setStartOffset(animationDelay);
animationTarget.startAnimation(cardDealingAnimation);
}
发生的事情是它只是在新的地方弹出而不显示中间的地方。 有趣的是,有时它确实会出现在我的一个目标上。
最佳答案
我在这里看到两个问题。
一个问题是您正在获取对象在窗口中的位置,而您应该只使用对象在其父容器中的位置。它更容易、更快,而且更多您正在寻找的东西 - 对象在其布局中的位置。如果它们不在同一个容器中,那么您可能需要获取窗口或屏幕中的位置,然后只处理增量值(它们位置的差异,而不是绝对位置本身)。
您可以从 View 的 getLeft() 和 getTop() 方法中获取这些简单的容器位置。
第二个问题是 TranslateAnimation 参数没有按您认为的那样执行。数值(第二个、第四个、第六个和第八个值)将目标对象的开始和结束位置指定为与其当前位置的偏移量。这就是为什么他们在方法声明中有“delta”这个词。因此,您不应发送对象位置的绝对坐标,而应发送它们应具有的增量。
假设您已经计算了 xDelta 和 yDelta 作为源位置和目标位置之间 x 和 y 的差异。如果您将源设置为目标位置的动画,那么您可以为这些值使用 0、xDelta、0、yDelta 之类的值。
请注意,TranslateAnimation() 不会实际移动对象 - 它只是将其绘制在不同的位置。因此,一旦动画完成,对象就会迅速回到其原始位置。您可能希望设置 fillAfter 属性以在动画完成时保持其在屏幕上的结束位置。
关于Android TranslationAnimation 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982771/