Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 449|回复: 0

Android -- Fragment动画异常Unknown animation name: objectAnimator

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-24 06:55:00 | 显示全部楼层 |阅读模式

    异常                                                                                   

    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相关类。

    我是天王盖地虎的分割线                                                             

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-11 15:10 , Processed in 0.059005 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表