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
时,一切正常!你的解决方案是什么,我想在动画结束时显示
插值器