Android -- Fragment动画异常Unknown animation name: objectAnimator
異常???????????????????????????????????????????????????????????????????????????????????
Caused by: java.lang.RuntimeException: Unknown animation name: objectAnimator
異常代碼?????????????????????????????????????????????????????????????????????
FragmentTransaction ft = getFragmentManager().beginTransaction(); //setCustomAnimations()必須位于replace()之前,否則效果不起所中。它的兩個參數(shù)分別為enter,exit的效果。系統(tǒng)目前提供兩個效果,分別為android.R.animator.fade_in和android.R.animator.fade_out ft.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right); ft.addToBackStack(null); ft.replace(R.id.details,"detail"); ft.commit(); <?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:interpolator/accelerate_decelerate" android:valueFrom="-1280" android:valueTo="0" android:valueType="floatType" android:propertyName="X" android:duration="2000" /> <?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:interpolator/accelerate_decelerate" android:valueFrom="0" android:valueTo="1280" android:valueType="floatType" android:propertyName="X" android:duration="2000" />動畫簡單說明?????????????????????????????????????????????????????????????????????????
實現(xiàn)自定義動畫的類是ObjectAnimator,不僅用于fragment,也可用于view。在xml中,定義了從“from”狀態(tài)到“to”狀態(tài),時間間隔為duration(毫秒),所執(zhí)行的變化規(guī)則稱為interpolator。最簡單的interpolator是linear,即@android:interpolator/linear,從狀態(tài)From到to狀態(tài)是均勻變化。缺省的interpolator是accelerate_decelerate。系統(tǒng)提供的方式可以在源代碼/data/res/interpolator中查看。android:propertyName用于動畫的維度,在本例中X表示橫向,根view的setX()中的參數(shù)是float,所以設(shè)置valueType為floatType。我們設(shè)置可以設(shè)置自己的維度。From設(shè)置為-1280,因為這個值對于終端設(shè)備而言,-1280個像素位可以確保從不可視的位置移入。如果我們沒有設(shè)置From,系統(tǒng)會根據(jù)當(dāng)前值來設(shè)定初始值。
?
如果我們要在兩個或者兩個以上的維度設(shè)置變化,可以使用set tag,對應(yīng)為Android的AnimatorSet類,下面的例子同時設(shè)置向下和淡出效果。set有一個屬性android:ordering,缺省為together,即各個維度的變化同時發(fā)生,還可以設(shè)置為sequentially依次發(fā)生。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:interpolator="@android:interpolator/accelerate_cubic" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:propertyName="alpha" android:duration="1000"/> <objectAnimator android:interpolator="@android:interpolator/accelerate_cubic" android:valueFrom="0" android:valueTo="1280" android:valueType="floatType" android:propertyName="Y" android:duration="1000"/> </set>異常分析??????????????????????????????????????????????????????????????????????????????
V4包中的Fragment對于動畫的支持不完全。
在FragmentManager類中的loadAnimation方法
if (transitionStyle == 0) {return null;}//TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,// com.android.internal.R.styleable.FragmentAnimation);//int anim = attrs.getResourceId(styleIndex, 0);//attrs.recycle();//if (anim == 0) {// return null;//}//return AnimatorInflater.loadAnimator(mActivity, anim);return null;在AnimatorInflater.loadAnimator里面處理的動畫:
String name = parser.getName();if (name.equals("objectAnimator")) {anim = loadObjectAnimator(c, attrs);} else if (name.equals("animator")) {anim = loadAnimator(c, attrs, null);} else if (name.equals("set")) {anim = new AnimatorSet();TypedArray a = c.obtainStyledAttributes(attrs,com.android.internal.R.styleable.AnimatorSet);int ordering = a.getInt(com.android.internal.R.styleable.AnimatorSet_ordering,TOGETHER);createAnimatorFromXml(c, parser, attrs, (AnimatorSet) anim, ordering);a.recycle();} else {throw new RuntimeException("Unknown animator name: " + parser.getName());} private static ObjectAnimator loadObjectAnimator(Context context, AttributeSet attrs)throws NotFoundException {ObjectAnimator anim = new ObjectAnimator();loadAnimator(context, attrs, anim);TypedArray a =context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.PropertyAnimator);String propertyName = a.getString(com.android.internal.R.styleable.PropertyAnimator_propertyName);anim.setPropertyName(propertyName);a.recycle();return anim;}So?????????????????????????????????????????????????????????????????????????????????????
在使用V4包中Fragment時,使用的切換動畫效果,其動畫文件中不能包含objectAnimator,Animator這類標(biāo)簽。如果必須要使用,請將工程中使用的V4包中Fragment相關(guān)類,換成源碼中的Fragment相關(guān)類。
我是天王蓋地虎的分割線?????????????????????????????????????????????????????????????
轉(zhuǎn)載于:https://www.cnblogs.com/yydcdut/p/4084185.html
總結(jié)
以上是生活随笔為你收集整理的Android -- Fragment动画异常Unknown animation name: objectAnimator的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【并查集】 HDU 4424 Conqu
- 下一篇: 静态页中调用动态数据的三种办法