2

众所周知,android坐标系是从android屏幕的左上角开始的。x 轴向下增长,y 轴向右增长。但我发现它不适合动画。

例如,我使用构造函数初始化了 TranslateAnimation:

TranslateAnimation ta = new TranslateAnimation(0.0f, 200, 0.0f, 200);  

坐标系变了吗?我发现它不是从左上角开始的。

然后我初始化了另一个 translateAnimation 以向上和向右移动:

TranslateAnimation ta = new TranslateAnimation(0.0f, 200, 0.0f, -200); 
ta.setReaptMode(Animation.REVERSE);

会发现相同的行为。我对此感到困惑。

4

1 回答 1

0

我相信 TranslateAnimation 的构造函数使用增量。看到这个。或查看构造函数 sig。: (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta). 所以如果你想要你的动画。要先跳起来您可以使用负的第三个 ctor 参数。

更确切地说:

直到布局被测量后,动画才能开始。人们通常不必担心这是如何工作的,因为该算法大多非常好,您可以通过设置布局参数来控制其策略。简而言之,当动画可能开始时,我们知道希望视图在屏幕上的哪个位置,因为您设置了布局参数。

翻译动画然后从那个位置获取增量。因此,您当前的动画不应从左上角开始,而应从 onMeasure 评估这些布局参数的任何位置开始。

有人会说——多么烦人。即使你只想做一些简单的上下式动画,它也会变得复杂......好吧,这是一个可取的开发策略;它使安卓动画开发变得轻而易举。animationListener在每个动画上设置一个。在 onAnimationEnd 中,可能以参数化的方式,将动画视图上的布局参数重置为您期望的位置。这样,当您再次重新应用动画时,就不会出现令人惊讶的“跳跃”。invalidate在某些情况下,您可能需要,或clearAnimation. 这样做的原因是测量通过将再次出现,您将为您的TranslateAnimation. 最后,您可能希望使用将所有这些重置发布到视图的消息队列post(Runnable runnable)在侦听器中,因此您离开了动画绘制的最后一关。

我也发现 android Animations 有时会让你感到惊讶并引起神经质的行为。但是,如果您这样做,那么使用 delta 参数的构造函数就不会再令人困惑了。

于 2013-05-03T09:36:45.260 回答