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