zoukankan      html  css  js  c++  java
  • Android -- Fragment动画异常Unknown animation name: objectAnimator

    异常                                                                                   

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

    异常代码                                                                     

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    //setCustomAnimations()必须位于replace()之前,否则效果不起所中。它的两个参数分别为enter,exit的效果。系统目前提供两个效果,分别为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" />

    动画简单说明                                                                         

    实现自定义动画的类是ObjectAnimator,不仅用于fragment,也可用于view。在xml中,定义了从“from”状态到“to”状态,时间间隔为duration(毫秒),所执行的变化规则称为interpolator。最简单的interpolator是linear,即@android:interpolator/linear,从状态From到to状态是均匀变化。缺省的interpolator是accelerate_decelerate。系统提供的方式可以在源代码/data/res/interpolator中查看。android:propertyName用于动画的维度,在本例中X表示横向,根view的setX()中的参数是float,所以设置valueType为floatType。我们设置可以设置自己的维度。From设置为-1280,因为这个值对于终端设备而言,-1280个像素位可以确保从不可视的位置移入。如果我们没有设置From,系统会根据当前值来设定初始值。

    如果我们要在两个或者两个以上的维度设置变化,可以使用set tag,对应为Android的AnimatorSet类,下面的例子同时设置向下和淡出效果。set有一个属性android:ordering,缺省为together,即各个维度的变化同时发生,还可以设置为sequentially依次发生。

    <?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这类标签。如果必须要使用,请将工程中使用的V4包中Fragment相关类,换成源码中的Fragment相关类。

    我是天王盖地虎的分割线                                                             

  • 相关阅读:
    又爱又恨的eval
    http_build_query 这个方法会把值为NULL的给干掉
    allow_url_fopen设置
    纠结了下 B 和 STRONG标签区别
    Drupal 发邮件模块 drupal smtp 安装与设置
    php array_merge 和 两数组相加区别
    学历严格正相关于素质 Kai
    表语就是主语补语,靠 Kai
    一些真正有思想的up Kai
    光速不变且最大,换个思路想,非常合理,犹如天经地义【转载】 Kai
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4084185.html
Copyright © 2011-2022 走看看