Android TranslationAnimation 无法正常工作

标签 android animation

我正在尝试在屏幕上制作卡片动画。

我的代码是这样的:

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/

相关文章:

java - 如何使用 Singleton 类将列表数据从一个 fragment 传递到另一个 fragment ?

android - Android 3.2 的谷歌电视模拟器

objective-c - 复制 iOS 7 主屏幕动画

java - 如何在 Android 上将 xml 转换为 html?

javascript - 在手持设备上禁用 fancybox

java - 用户如何将图像导入到应用程序中?

ios - 为什么约束更改或动画不需要调用setNeedsUpdateConstraints?

java - 动画在特定时间开始

c# - 在 XNA 中创建二维多边形

c++ - Ease of Motion函数(Ease to number)C++