如何解决AnimatorSet在顺序播放时停止
以下是示例列表:[[1、3],[2、3],[2、4]]
这是我编写的将运动依次动画到这些点的代码:
ArrayList<Animator> movements = new ArrayList<>();
int prevY = start[1];
int prevX = start[0];
for (int[] square : path) {
ObjectAnimator motion = new ObjectAnimator();
float[] coord = screenFromGrid(square[0],square[1],gridSizeY);
long speed = (long) (6000.0 / this.displayMetrics.widthPixels);
speed = (long) (speed * getSquareSize(gridSizeY));
if (square[0] != prevX) {
motion = ObjectAnimator.ofFloat(this.sprite1,"x",coord[0]);
motion.setInterpolator(new LinearInterpolator());
motion.setDuration(speed);
movements.add(motion);
prevX = square[0];
} else if (square[1] != prevY) {
motion = ObjectAnimator.ofFloat(this.sprite1,"y",coord[1]);
motion.setInterpolator(new LinearInterpolator());
motion.setDuration(speed);
movements.add(motion);
prevY = square[1];
}
}
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playSequentially(movements);
animatorSet.start();
问题在于动画完全停止在中间而没有引发任何错误。
我检查了调试器,并说所有动画都已正确存储。
有人知道为什么会这样吗?
解决方法
从经验中我所知道的是,AnimatorSet存在错误,并且无法始终按预期运行,我也遇到了问题,幸运的是找到了另一种更好的方法: ViewPropertyAnimator是用简短的代码为View设置动画的一种好方法。您可以编写自己的方法,可以根据需要进行修改和重用,例如:
private void customAnimation(View view,float toX,float toY,int duration,boolean loop) {
view.animate()
.translationX(toX)
.translationY(toY)
.setDuration(duration)
.setInterpolator(new LinearInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if(loop) {
customAnimation(...,false);
}
}
});
侦听器等待第一个动画完成,因此您可以在那里调用下一个动画。为了连续播放而不循环播放,我在参数中添加了一个布尔值,如果为true,则仅执行下一个动画。
这还将使您的其余代码缩短为类似这样的内容:
int prevY = start[1];
int prevX = start[0];
for (int[] square : path) {
float[] coord = screenFromGrid(square[0],square[1],gridSizeY);
long speed = (long) (6000.0 / this.displayMetrics.widthPixels);
speed = (long) (speed * getSquareSize(gridSizeY));
if (square[0] != prevX) {
customAnimation(this.sprite1,coord[0],speed,true);
prevX = square[0];
} else if (square[1] != prevY) {
customAnimation(this.sprite1,coord[1],true);
prevY = square[1];
}
}
请务必检查docs中所有可用的方法,也许.translationXBy(float byX)比.translationX(float toX)更适合您的情况
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。