Android TranslationAnimation无法正常工作

the*_*itz 1 animation android

我试图在屏幕上动画卡片.

我的代码看起来像这样:

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);
}
Run Code Online (Sandbox Code Playgroud)

会发生什么,它只是弹出新的地方而不显示中间的位置.有趣的是,在我的一个目标上它有时会显示出来.

Che*_*ase 8

我在这里看到两个问题.

一个问题是,您在窗口中获取对象的位置,您应该在其父容器中使用对象的位置.它更容易,更快,更适合您所寻找的 - 物体在其布局中的位置.如果它们不在同一个容器中,那么您可能需要在窗口或屏幕中获取位置,然后只处理delta值(它们的位置差异,而不是绝对位置本身).

您可以从View上的getLeft()和getTop()方法获取这些简单的容器位置.

第二个问题是TranslateAnimation参数不能按照您的想法执行.数值(第二,第四,第六和第八个值)将目标对象的起始位置和结束位置指定为其当前位置的偏移量.这就是为什么他们在方法声明中有'delta'这个词的原因.所以你不应该发送对象的绝对坐标来定位它们,而应该发送它们应该具有的增量.

假设您已计算出xDelta和yDelta为源位置和目标位置之间x和y的差异.如果您将源设置为目标位置的动画,则可以使用0,xDelta,0,yDelta等值来表示这些值.

请注意,TranslateAnimation()不会物理移动对象 - 它只是在不同的位置绘制它.因此,一旦动画完成,对象将快速回到其原始位置.您可能希望设置fillAfter属性以在动画完成时在屏幕上保持其结束位置.