首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顺序播放时停止AnimatorSet

顺序播放时停止AnimatorSet
EN

Stack Overflow用户
提问于 2020-11-09 08:25:46
回答 1查看 53关注 0票数 1

我有一些代码可以创建一个名为path的点列表。

示例列表如下:[1,3,2,3,2,4]

以下是我编写的代码,用于按顺序对这些点进行动画移动:

代码语言:javascript
复制
        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();

问题是动画在中间完全停止,没有抛出任何错误。

我检查了调试器,它显示所有动画都已正确存储。

有人知道为什么会这样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-10 01:30:28

根据我的经验,我所知道的是,AnimatorSet有错误,并且并不总是像预期的那样工作,我也有我的问题,幸运的是,我找到了另一种更好的方法:ViewPropertyAnimator是一种用简短而简洁的代码来动画视图的很好的方法。您可以编写自己的方法,可以根据需要进行修改和重用,如下所示:

代码语言:javascript
复制
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,则只执行下一个动画。

这也会将代码的其余部分缩短为如下所示:

代码语言:javascript
复制
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], 0, speed, true);
        prevX = square[0];
    } else if (square[1] != prevY) {
        customAnimation(this.sprite1, 0, coord[1], speed, true);
        prevY = square[1];
    }
}

一定要检查docs中所有可用的方法,也许.translationXBy(float byX).translationX(float toX)更适合您的情况

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64744445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档