StackruError при использовании ViewCompat
Я использую viewCompat
совместить мою анимацию для снижения API (10).
Но когда я развертываю это на эмуляторе, я получаю StackruError
Это мой код:
private void fabFadeIn(){
if (floatingActionButton.getVisibility() == View.GONE) {
floatingActionButton.setVisibility(View.VISIBLE);
ViewCompat.setAlpha(floatingActionButton, 0f);
ViewCompat.setScaleX(floatingActionButton, 0f);
ViewCompat.setScaleY(floatingActionButton, 0f);
ViewCompat.animate(floatingActionButton)
.alpha(1)
.scaleX(1)
.scaleY(1)
.setDuration(300)
.setInterpolator(new OvershootInterpolator())
.setListener(new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
}
@Override
public void onAnimationEnd(View view) {
ViewCompat.animate(floatingActionButton).setInterpolator(new LinearOutSlowInInterpolator()).start();
}
@Override
public void onAnimationCancel(View view) {
}
})
.start();
}
}
И это ошибка:
java.lang.StackruError
at java.lang.Thread.currentThread(Thread.java:557)
at java.lang.ThreadLocal.get(ThreadLocal.java:59)
at android.view.ViewRoot.getRunQueue(ViewRoot.java:3340)
at android.view.View.removeCallbacks(View.java:5407)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.removeStartMessage(ViewPropertyAnimatorCompat.java:341)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:268)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.startAnimation(ViewPropertyAnimatorCompat.java:308)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimatorCompatImpl.start(ViewPropertyAnimatorCompat.java:269)
at android.support.v4.view.ViewPropertyAnimatorCompat.start(ViewPropertyAnimatorCompat.java:1249)
at com.test.app.activities.MainActivity$2.onAnimationEnd(MainActivity.java:305)
at android.support.v4.view.ViewPropertyAnimatorCompat$BaseViewPropertyAnimat
Как вы видите, ошибка восходит к onAnimationEnd
раздел кода.
2 ответа
Если мы пойдем к источникам, то увидим, что одна из реализаций совместимых animate
метод это:
@Override
public ViewPropertyAnimatorCompat animate(View view) {
if (mViewPropertyAnimatorCompatMap == null) {
mViewPropertyAnimatorCompatMap = new WeakHashMap<>();
}
ViewPropertyAnimatorCompat vpa = mViewPropertyAnimatorCompatMap.get(view);
if (vpa == null) {
vpa = new ViewPropertyAnimatorCompat(view);
mViewPropertyAnimatorCompatMap.put(view, vpa);
}
return vpa;
}
Поэтому во внутренней совместимой анимации используйте кеш аниматоров, прикрепленный к вашему виду. Теперь вернемся к вашему делу. У вас есть вид floatingActionButton
, А ты позвони ViewCompat.animate()
для этого. Тогда во внутренних реализациях ViewPropertyAnimatorCompat
создан и назначен для вашего просмотра. Затем вы set
слушатель для этого.
После окончания анимации вы звоните animate
снова и вместо создания нового ViewPropertyAnimatorCompat
(кажется логичным) вы получили ранее созданный ViewPropertyAnimatorCompat
с вашим назначенным слушателем. И, таким образом, у вас есть бесконечный цикл.
Чтобы это исправить, вам нужно написать что-то вроде:
ViewCompat.animate(floatingActionButton)
.alpha(1)
.scaleX(1)
.scaleY(1)
.setDuration(300)
.setInterpolator(new OvershootInterpolator())
.setListener(new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
}
@Override
public void onAnimationEnd(View view) {
ViewCompat.animate(floatingActionButton).setInterpolator(new LinearOutSlowInInterpolator()).setListener(null).start();
}
@Override
public void onAnimationCancel(View view) {
}
})
.start();
Короче нужно добавить .setListener(null)
для построения анимации в onAnimationEnd
Перезвоните
Ты звонишь ViewCompat.animate(floatingActionButton)
Внутри ViewCompat.animate(floatingActionButton)
так что вы получите бесконечный цикл:
ViewCompat.animate(floatingActionButton)
....
@Override
public void onAnimationEnd(View view) {
ViewCompat.animate(floatingActionButton).setInterpolator(new LinearOutSlowInInterpolator()).start();
}
@Override
public void onAnimationCancel(View view) {
}
})
.start();