Приложение аварийно завершает работу при запуске комбинированных AnimatorSets - UnsupportedOperationException

Я пытаюсь совместить два AnimatorSets C и D в AnimatorSet Е, которые являются комбинациями AnimatorSets сами, а именно C.plaTogether(aniSet1, aniSet2) а также D.playSequentially(aniSet3, aniSet4),

Если я запускаю C или D в одиночку, все работает нормально, но если я пытаюсь объединить их с E.playTogetherприложение вылетает со следующим кодом ошибки:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.undisclosed123.flippingcards, PID: 9180
                  java.lang.IllegalStateException: Could not execute method for android:onClick
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
                      at android.view.View.performClick(View.java:6294)
                      at android.view.View$PerformClick.run(View.java:24770)
                      at android.os.Handler.handleCallback(Handler.java:790)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6494)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
                      at android.view.View.performClick(View.java:6294) 
                      at android.view.View$PerformClick.run(View.java:24770) 
                      at android.os.Handler.handleCallback(Handler.java:790) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6494) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
                   Caused by: java.lang.UnsupportedOperationException: Sorting went bad, the start event should always be at index 0
                      at android.animation.AnimatorSet.sortAnimationEvents(AnimatorSet.java:1631)
                      at android.animation.AnimatorSet.createDependencyGraph(AnimatorSet.java:1527)
                      at android.animation.AnimatorSet.initAnimation(AnimatorSet.java:700)
                      at android.animation.AnimatorSet.start(AnimatorSet.java:719)
                      at android.animation.AnimatorSet.start(AnimatorSet.java:684)
                      at com.undisclosed123.flippingcards.FlipActivity.altFlipCard(FlipActivity.java:237)
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384) 
                      at android.view.View.performClick(View.java:6294) 
                      at android.view.View$PerformClick.run(View.java:24770) 
                      at android.os.Handler.handleCallback(Handler.java:790) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6494) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
I/zygote: Do partial code cache collection, code=23KB, data=30KB
          After code cache collection, code=23KB, data=30KB
          Increasing code cache capacity to 128KB
Device emulator-5554disconnected, monitoring stopped.
Application terminated.

Видимо, есть исключение:

Caused by: java.lang.UnsupportedOperationException: Sorting went bad, the start event should always be at index 0

Он вызывается методом, который вызывается событием onClick:

public void altFlipCard(View view) {


    if(!isBackVisible) {
        mCardBackLayout.setVisibility(View.VISIBLE);
    }
    if (!isBackRevealed) {
        AnimatorSet frontOut = new AnimatorSet();
        frontOut.playTogether(animLOutXY, mSetRotOne);
        frontOut.setTarget(mCardFrontLayout);
        frontOut.setDuration(R.integer.anim_length);

        animRInXY.setTarget(mCardBackLayout);

        frontOut.start();  //  <---  the ERROR Code points to this line

        animRInXY.start();

        isBackRevealed = true;
    }else {
        animROutXY.setTarget(mCardBackLayout);
        animLInXY.setTarget(mCardFrontLayout);
        animROutXY.start();
        animLInXY.start();
        isBackRevealed = false;
    }

}

Я, наверное, должен показать вам код для animLOutXY а также mSetRotOne которые объединены в frontOut,

Первый, animLOutXYодин C представляет собойplayTogether()):

mSetLeftOut = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.ani_out_left);

mSetLeftOut_x = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.ani_out_left_x);

animLOutXY = createAltObjAnimatorsIn(mSetLeftOut, mSetLeftOut_x,0, -180, 0, 2*angle);

private AnimatorSet createAltObjAnimatorsIn(AnimatorSet setA, AnimatorSet setB, int start1, int end1, int start2, int end2) {
    List<Animator> animatorsA = setA.getChildAnimations();
    for(int i = 0; i < animatorsA.size(); i++ ){
        Animator animator = animatorsA.get(i);
        if(animator instanceof ObjectAnimator) {
            ObjectAnimator objectAnimator = (ObjectAnimator) animator;
            if ("rotationY".equals(objectAnimator.getPropertyName())) {

                float fromValue = start1;
                float toValue = end1;
                objectAnimator.setFloatValues(fromValue, toValue);
            }
        }
    }

    List<Animator> animatorsB = setB.getChildAnimations();
    for(int i = 0; i < animatorsB.size(); i++ ){
        Animator animator = animatorsB.get(i);
        if(animator instanceof ObjectAnimator) {
            ObjectAnimator objectAnimator = (ObjectAnimator) animator;
            if ("rotationX".equals(objectAnimator.getPropertyName())) {

                float fromValue = start2;       
                float toValue = end2;           

                objectAnimator.setFloatValues(fromValue, toValue);
            }
        }
    }

    AnimatorSet setC = new AnimatorSet();
    setC.playTogether(setA, setB);

    return setC;
}

и XML-файлы формы animLOutXY, ani_out_lest.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="0"
        android:valueTo="-180"
        android:propertyName="rotationY"
        android:duration="@integer/anim_length" />

    <objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="@integer/anim_length_half"
        android:duration="1" />

</set>

и ani_out_left_x.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:valueFrom="0"
        android:valueTo="0"
        android:propertyName="rotationX"
        android:duration="@integer/anim_length" />

    <objectAnimator
        android:valueFrom="1.0"
        android:valueTo="0.0"
        android:propertyName="alpha"
        android:startOffset="@integer/anim_length_half"
        android:duration="1" />

</set>

mSetRotOneтот, который представлен D (playSequentially()):

private void create2DRotAnimators() {
    ObjectAnimator animatorOnePart1 = new ObjectAnimator();
    animatorOnePart1.setPropertyName("rotation");
    animatorOnePart1.setFloatValues(0, 2*angle);

    ObjectAnimator animatorOnePart2 = new ObjectAnimator();
    animatorOnePart2.setPropertyName("rotation");
    animatorOnePart2.setFloatValues(0, 2*angle);

    mSetRotOne = new AnimatorSet();
    mSetRotOne.playSequentially(animatorOnePart1, animatorOnePart2);
}

Для этого не используется XML-файл.

0 ответов

Другие вопросы по тегам