2017-04-25 48 views
0

我正在嘗試使FAB drawable動畫,但會引發此錯誤。錯誤發生在我呼叫。start()的行上。無法使用AnimatedVectorDrawable對FAB繪製進行動畫處理

--------- 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) 

這是MainActivity在那裏我試圖動畫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(); 
      } 
     }); 

我已經使用Roman Nurik的Android圖標動畫製作了動畫製作的自定義繪圖。

<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> 

animate_forward和animate_backword xmls類似。只有路徑中的字符串值互換。

這是我第一次使用AnimatedVectorDrawables。有什麼我失蹤?所有的教程都會在網絡上顯示相同的代碼。

回答

3

目標名稱必須是要設置動畫的對象的名稱。改爲將目標名稱設置爲「foo」。您也不需要爲ObjectAnimator本身設置任何名稱。

+0

非常感謝。因此,如果我有一個名爲「foo1」和「foo2」的路徑的矢量,那麼目標也應該命名爲「foo1」和「foo2」,以便它知道執行動畫的路徑? –

+0

是的。您設置一個目標併爲每個對象創建一個動畫以進行動畫製作。然後,您可以使用動畫製作器同時爲該對象的一個​​或多個屬性製作動畫。 – BladeCoder

+0

明白!謝謝!我對這個主題感到非常困惑,這個錯誤信息讓我更加困惑。我會嘗試動畫更多的對象並嘗試掌握這個主題。 –