Приложение аварийно завершает работу при запуске комбинированных 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-файл.