Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onAnimationEnd未被调用_Android_Animation_Objectanimator_Animatorset - Fatal编程技术网

Android onAnimationEnd未被调用

Android onAnimationEnd未被调用,android,animation,objectanimator,animatorset,Android,Animation,Objectanimator,Animatorset,因为animator set不提供重复功能, 我正在实现我自己的重复逻辑 但我有个问题 首先,让我向您展示我的示例代码,如下所示 我的主要活动-> public class MainActivity extends AppCompatActivity { private ImageView imageView; private Button button; private AnimatorSet animatorSet; private Repetition

因为animator set不提供重复功能, 我正在实现我自己的重复逻辑

但我有个问题

首先,让我向您展示我的示例代码,如下所示

我的主要活动->

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;
    private Button button;

    private AnimatorSet animatorSet;
    private Repetition repetition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.image_view);
        button = (Button) findViewById(R.id.button);

        animatorSet = new AnimatorSet();
        repetition = new Repetition();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startAnimation();
            }
        });
    }

    private void startAnimation() {
        imageView.post(new Runnable() {
            @Override
            public void run() {
                final ObjectAnimator moveY = ObjectAnimator.ofFloat(imageView, "y", imageView.getY(), imageView.getY() - 200F);
                moveY.setDuration(1000);

                final ObjectAnimator rotation = ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F);
                rotation.setDuration(1000);

                repetition.repeat(animatorSet, 10);

                List<Animator> list = new ArrayList<>();

                list.add(moveY);
                list.add(rotation);

                // problem is here, if i run a single animator, repetition class can not get onAnmationEnd callback.
                animatorSet.play(moveY);

                // if i run playSequentially with multiple animators it works properly;
//                animatorSet.playSequentially(list);
                animatorSet.start();
            }
        });
    }

}
public类MainActivity扩展了AppCompatActivity{
私人影像视图;
私人按钮;
私人动画师集;
私人重复;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(imageView)findViewById(R.id.image\u视图);
按钮=(按钮)findViewById(R.id.button);
animatorSet=新的animatorSet();
重复=新的重复();
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startAnimation();
}
});
}
私有void startAnimation(){
post(新的Runnable(){
@凌驾
公开募捐{
final ObjectAnimator moveY=ObjectAnimator.offload(imageView,“y”,imageView.getY(),imageView.getY()-200F);
moveY.setDuration(1000);
最终ObjectAnimator旋转=ObjectAnimator.offload(图像视图,“旋转”,0F,360F);
轮换。设定持续时间(1000);
重复。重复(动画师集,10);
列表=新的ArrayList();
列表。添加(移动);
增加(轮换);
//问题是,若我只运行一个动画师,那个么重复类就不能得到OnAnimationEnd回调。
动画集。播放(移动);
//如果我与多个动画师按顺序运行Play,它将正常工作;
//按顺序播放动画集(列表);
animatorSet.start();
}
});
}
}
我的重复支持课程->

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;
    private Button button;

    private AnimatorSet animatorSet;
    private Repetition repetition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.image_view);
        button = (Button) findViewById(R.id.button);

        animatorSet = new AnimatorSet();
        repetition = new Repetition();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startAnimation();
            }
        });
    }

    private void startAnimation() {
        imageView.post(new Runnable() {
            @Override
            public void run() {
                final ObjectAnimator moveY = ObjectAnimator.ofFloat(imageView, "y", imageView.getY(), imageView.getY() - 200F);
                moveY.setDuration(1000);

                final ObjectAnimator rotation = ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F);
                rotation.setDuration(1000);

                repetition.repeat(animatorSet, 10);

                List<Animator> list = new ArrayList<>();

                list.add(moveY);
                list.add(rotation);

                // problem is here, if i run a single animator, repetition class can not get onAnmationEnd callback.
                animatorSet.play(moveY);

                // if i run playSequentially with multiple animators it works properly;
//                animatorSet.playSequentially(list);
                animatorSet.start();
            }
        });
    }

}
它正在侦听animator的生命周期,如果动画结束,则在onAnimationEnd回调中将所需动画重复计数与当前重复计数进行比较。如果我只运行一个动画师。。onAnimationEnd未被调用

只是第一次调用onAnimationEnd

public class Repetition implements Animator.AnimatorListener {

    private AnimatorSet animatorSet;
    private int repeatCount;

    private int currentRepeatCount;

    public void repeat(AnimatorSet animatorSet, int repeatCount) {
        this.animatorSet = animatorSet;
        this.repeatCount = repeatCount;

        animatorSet.removeAllListeners();
        animatorSet.addListener(this);
    }

    @Override
    public void onAnimationStart(Animator animation) {
        Log.d("RepeatitionLog", "onAnimationStart");
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        if(currentRepeatCount < repeatCount) {
            animatorSet.start();
            currentRepeatCount++;
            Log.d("RepeatitionLog", "onAnimationRepeat by repetition");
            Log.d("RepeatitionLog", "currentRepeatCount : " + currentRepeatCount);
        } else {
            Log.d("RepeatitionLog", "onAnimationEnd");
        }
    }

    @Override
    public void onAnimationCancel(Animator animation) {
        Log.d("RepeatitionLog", "onAnimationCancel");
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        Log.d("RepeatitionLog", "onAnimationRepeat");
    }
}
公共类重复实现Animator.AnimatorListener{
私人动画师集;
私有整数重复计数;
私有int-currentRepeatCount;
公共无效重复(AnimatorSet AnimatorSet,int repeatCount){
this.animatorSet=animatorSet;
this.repeatCount=repeatCount;
animatorSet.removeAllListeners();
animatorSet.addListener(此);
}
@凌驾
AnimationStart(动画师动画)上的公共无效{
Log.d(“repeationlog”、“onAnimationStart”);
}
@凌驾
AnimationEnd上的公共无效(Animator动画){
如果(currentRepeatCount
我将感谢任何帮助

谢谢