我正在尝试在屏幕上制作卡片。
我的代码如下所示:
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);
}
发生的事情是它只是在新的地方弹出而没有显示介于两者之间的地方。 有趣的是,在我的一个目标上它有时会出现。
答案 0 :(得分:8)
我在这里看到两个问题。
一个问题是,您在窗口中获取对象的位置,您应该在其父容器中使用对象的位置。它更容易,更快,更适合您所寻找的 - 物体在其布局中的位置。如果它们不在同一个容器中,那么您可能需要在窗口或屏幕中获取位置,然后只处理delta值(它们的位置不同,而不是绝对位置本身)。
您可以从View上的getLeft()和getTop()方法获取这些简单的容器位置。
第二个问题是TranslateAnimation参数没有按照您的想法执行。数值(第二,第四,第六和第八个值)指定目标对象的起始位置和结束位置作为其当前位置的偏移量。这就是为什么他们在方法声明中有'delta'这个词的原因。所以你不应该发送对象的绝对坐标来定位它们,而应该发送它们应该具有的增量。
假设您已计算出xDelta和yDelta为源位置和目标位置之间x和y的差异。如果你将源动画到目标位置,那么你可以使用0,xDelta,0,yDelta这些值。
请注意,TranslateAnimation()不会物理移动对象 - 它只是在不同的位置绘制它。因此,一旦动画完成,对象将快速回到其原始位置。您可能希望设置fillAfter属性以在动画完成时在屏幕上保持其结束位置。