1. 程式人生 > >Android程式設計之Fragment使用動畫造成Unknown animation name: objectAnimator異常

Android程式設計之Fragment使用動畫造成Unknown animation name: objectAnimator異常

在為Fragment做切換動畫,啟動後遇到了一個異常:

Caused by: java.lang.RuntimeException: Unknown animation name: objectAnimator

截圖如下:

我的程式碼如下:

    fragment = Fragment.instantiate(getActivity(), clz.getName());
    fragment.setArguments(args);
    ft.setCustomAnimations(R.animator.fragment_rotate_enter,
            R.animator.fragment_rotate_exit,
            R.animator.fragment_rotate_pop_enter,
            R.animator.fragment_rotate_pop_exit);
    ft.replace(R.id.fragment_stub, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);

我的動畫檔案如下,其他三個大同小異,就不貼出來了  :

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        android:duration="1000"
        android:propertyName="rotationY"
        android:valueFrom="180.0"
        android:valueTo="360.0"
        android:valueType="floatType" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="alpha"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType" />

</set>

對於這個異常,網上有很多說法,但我看了下解釋,都沒有切中要害。在這裡,我給具體講一下原因:

第一是因為我使用了objectAnimator這個動畫標籤,

第二是因為Fragment我使用的是V4包中的。

原因就在這裡:V4包中的Fragment對於動畫的支援不完全。如果手中有V4原始碼的同學,可以翻出來具體看看——在FragmentManager類中的loadAnimation方法。我這裡就直接貼圖了:

標記處的那個位置,就是關鍵程式碼。在這裡面才會處理與objectAnimator相關的標籤,如截圖所示:


所以,才會造成標題上那個異常。

這裡我再延伸一些內容:那麼V4包中的Fragment支援哪些動畫標籤內呢?看一下V4包中原始碼截圖:

那個錯誤異常,也就是這裡報出來的。

那麼,是不是就不能為Fragment切換使用objectAnimator的動畫標籤呢?

當然也不是不能,如果你非要使用這個動畫,就請使用原始碼中的Fragment,它是沒有註釋掉那段動畫載入程式碼的。

小結:
在使用V4包中Fragment時,使用的切換動畫效果,其動畫檔案中不能包含objectAnimator,Animator這類標籤。如果必須要使用,請將工程中使用的V4包中Fragment相關類,換成原始碼中的Fragment
相關類。

最後,附上那個我要做的動畫效果:一個翻牌的切換效果,是基於APIDemo修改的程式碼: