Android 使用ViewCompat时堆栈溢出错误
我正在使用Android 使用ViewCompat时堆栈溢出错误,android,android-animation,android-appcompat,viewpropertyanimator,Android,Android Animation,Android Appcompat,Viewpropertyanimator,我正在使用viewCompat将我的动画与较低的api(10)兼容 但当我在emulator上部署它时,我得到了StackOverflowerError 这是我的代码: private void fabFadeIn(){ if (floatingActionButton.getVisibility() == View.GONE) { floatingActionButton.setVisibility(View.VISIBLE); ViewCompa
viewCompat
将我的动画与较低的api(10)兼容
但当我在emulator上部署它时,我得到了StackOverflowerError
这是我的代码:
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.StackOverflowError
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
部分。您调用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();
在
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();
如果我们访问源代码,我们将看到,compatible
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;
}
简言之,您需要将
.setListener(null)
添加到onAnimationEnd
callback中的构建动画中。如果我们转到源代码,我们将看到,兼容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;
}
简言之,您需要将
.setListener(null)
添加到onAnimationEnd
回调中的构建动画中,但当我使用Animator
而不是ViewCompat
时,一切正常!你的解决方案是什么,我想在动画结束时显示插值器
?但是当我使用Animator
而不是ViewCompat
时,一切正常!你的解决方案是什么,我想在动画结束时显示插值器
?