Aakaash Jois
Aakaash Jois

Reputation: 288

Cannot animate FAB drawable using AnimatedVectorDrawable

I am trying to animate the FAB drawable but it throws this error. The error is thrown on the line where I call .start() on the drawable.

--------- beginning of crash
04-25 14:40:09.169 25611-25611/com.test.testingfabanimation E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                       Process: com.test.testingfabanimation, PID: 25611
                                                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
                                                                                           at android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT.createRTAnimator(AnimatedVectorDrawable.java:1262)
                                                                                           at android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT.parseAnimatorSet(AnimatedVectorDrawable.java:1220)
                                                                                           at android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT.init(AnimatedVectorDrawable.java:1187)
                                                                                           at android.graphics.drawable.AnimatedVectorDrawable.ensureAnimatorSet(AnimatedVectorDrawable.java:851)
                                                                                           at android.graphics.drawable.AnimatedVectorDrawable.start(AnimatedVectorDrawable.java:834)
                                                                                           at com.test.testingfabanimation.MainActivity$1.onPageSelected(MainActivity.java:41)
                                                                                           at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1967)
                                                                                           at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:685)
                                                                                           at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
                                                                                           at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2284)
                                                                                           at android.view.View.dispatchTouchEvent(View.java:10024)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2626)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2307)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
                                                                                           at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
                                                                                           at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413)
                                                                                           at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1809)
                                                                                           at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                                                                                           at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                                                           at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:375)
                                                                                           at android.view.View.dispatchPointerEvent(View.java:10244)
                                                                                           at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4438)
                                                                                           at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4306)
                                                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                                                                                           at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
                                                                                           at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
                                                                                           at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999)
                                                                                           at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
                                                                                           at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056)
                                                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                                                                                           at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
                                                                                           at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
                                                                                           at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
                                                                                           at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
                                                                                           at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246)
                                                                                           at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220)
                                                                                           at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181)
04-25 14:40:09.171 25611-25611/com.test.testingfabanimation E/AndroidRuntime:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349)
                                                                                           at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                                           at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                                           at android.os.MessageQueue.next(MessageQueue.java:323)
                                                                                           at android.os.Looper.loop(Looper.java:136)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:6169)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)

This is the code in MainActivity where I am trying to animate the FAB.

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        fab.setImageResource(R.drawable.animate_forward);
                        break;
                    case 1:
                        fab.setImageResource(R.drawable.animate_backward);
                        break;
                }
                Drawable drawable = fab.getDrawable();
                if (drawable instanceof AnimatedVectorDrawable)
                    ((AnimatedVectorDrawable) drawable).start();
            }
        });

I have created custom drawable for animating using Roman Nurik's Android Icon Animator.

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector
            android:width="24dp"
            android:height="24dp"
            android:viewportWidth="24"
            android:viewportHeight="24"
            android:alpha="1">
            <path
                android:name="foo"
                android:pathData="@string/forward"
                android:strokeColor="#000000"
                android:strokeWidth="2"
                android:strokeLineCap="round"/>
        </vector>
    </aapt:attr>
    <target android:name="path_morph">
        <aapt:attr name="android:animation">
            <objectAnimator
                android:name="foo"
                android:propertyName="pathData"
                android:duration="300"
                android:valueFrom="@string/forward"
                android:valueTo="@string/backward"
                android:valueType="pathType"
                android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
        </aapt:attr>
    </target>
</animated-vector>

The animate_forward and animate_backword xmls are similar. Only the string values in path are interchanged.

This is the first time I am working with AnimatedVectorDrawables. Is there something I am missing? All the tutorials show the same code on the web.

Upvotes: 0

Views: 580

Answers (1)

BladeCoder
BladeCoder

Reputation: 12949

The target name must be the name of the object to animate. Set the target name to "foo" instead. You also don't need to set any name to the ObjectAnimator itself.

Upvotes: 4

Related Questions