欢迎来到星空体育平台官网入口

电脑公司专业版 深度优化版 XP旗舰版 XP专业版64位 Win10正式版
当前位置: 主页 > IT资讯

属性动画的工作原理

时间:2024-06-24    来源:zoc7RcITctunhMtq7EzA    人气:

这篇文章是从微信公众号「Android开发编程」转载的,作者是Android开发编程。 如需转载此文,请联系Android开发编程公众号。

Android开发中,使用动画是一个常见的技术

不过,动画种类繁多,使用起来也比较复杂。当开发者需要实现复杂的动画效果时,很多人就感到无从下手

今天我们将通过源代码来分析属性动画的原理

一、简单应用动画

ValueAnimator

属性动画的核心类,其原理是控制数值的变化,然后手动将其赋值给对象的属性,实现动画效果

根据不同的控制数值,Android有三种构造方法可以实例化ValueAnimator对象:

星空体育官方

属性动画的工作原理

ValueAnimator.ofInt(int... values) -- 整型数值

ValueAnimator.ofFloat(float... values) -- 浮点数值

星空体育网站

ValueAnimator.ofObject(TypeEvaluator evaluator,自定义对象类型的构造函数(values) - Java中的方式以设置动画的开始和结束值。 ofInt() 具有以下两个功能:1. 实例化获取实例。 2. 在传入参数之间实现平滑过渡。例如,以下代码会使0平滑过渡到3。ValueAnimator的动画器变量值= ValueAnimator.ofInt(0,3);                 // 如果传入多个参数,效果为0->5,5->3,3->10                 // ValueAnimator 动画 = ValueAnimator.ofInt(0,5,3,设置动画的基本属性:\nanimator.setDuration(5000);// 播放时长\nanimator.setStartDelay(300);// 延迟播放\nanimator.setRepeatCount(0);// 重复次数\nanimator.setRepeatMode(ValueAnimator.RESTART);// 重复模式\n// ValueAnimator.START:正向\n// ValueAnimator.REVERSE:反向\n// 设置更新监听器,当值发生变化时触发。该函数只会被执行一次。animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){\n@Override\npublic void onAnimationUpdate(ValueAnimator animation){\nint currentValue = (int) animation.getAnimatedValue();\nLog.d("test",在动画更新时:当前数值); // 将改变后的数值赋给对象的属性值 view.setproperty(currentValue); // 刷新视图 view.requestLayout(); }); // 启动动画 animator.start();。 2、XML 方式 在 res/animator/ 路径下通常会创建 XML 文件,在上述文件中设置动画参数

。使用ValueAnimator时,需要使用<animator>标签来声明。在该标签内,需要添加如下属性:\n- android:duration="1000":动画持续时间为1秒;\n- android:valueFrom="1":动画起始值为1;\n- android:valueTo="0":动画结束值为0;\n- android:valueType="floatType":数值类型为浮点型;\n- android:repeatCount="1":动画重复次数为1次;\n- android:repeatMode="reverse":动画重复模式为反向。 \n之后,在Java代码中使用AnimatorInflater.loadAnimator(context, ...)启动动画。R.animator.set_animation);   // 加载XML动画 animator.setTarget(view);   // 设定动画对象 animator.start();   

2、原理解析


1、初始化动画

ObjectAnimator.ofFloat()开始;     /**      * 创建一个返回值为 float 的 ObjectAnimator 实例      *      * @param target 动画应用的对象。      * @param propertyName 表示属性的名称,要求对象必须具有setXXX() 方法,并且该方法是 公共的。@param propertyName: 要求对象必须具有公共的setXXX()方法,参数名称为属性名称。\n@param values: 属性变化的值,可以设置一个或多个。当只有 1 个时,起始值为属性值本身星空体育官方版。如果有 2 个数值,那么第 1 个将被视为起始值,第 2 个将被视为终止值。当数量超过 2 时,首尾的定义与 2 相同,中间的值则需经过计算得出。public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {\n ObjectAnimator anim = new ObjectAnimator(target,使用属性名作为参数,设置动画数值,返回动画对象。先创建一个实例,并为该实例设置数值;接着我们可以继续学习如何构建 ObjectAnimator 的过程。接下来,我们看一下 ObjectAnimator 的构造方法;创建一个 ObjectAnimator 实例时,需要传入目标对象作为参数。 调用了 setTarget() 方法并设置了目标对象;接着在调用setPropertyName()方法;\n2、调用了setTarget()方法:\npublic void setTarget(@Nullable Object target){\n final Object oldTarget = getTarget();\n if (oldTarget!如果mTarget不等于目标,请将mTarget设置为空。如果isStarted()返回true,取消操作。 null : new WeakReference<Object>(target);             // 在 开始 之前 应该 重新初始化             mInitialized = false;         }     } 星空体育入口

存在旧动画对象(也可能为 null),与新设置的动画对象不匹配;

如果旧动画对象处于开始状态,首先停止动画效果。接着以弱引用对象的形式记录动画对象;\n3、setPropertyName()方法\npublic void setPropertyName(@NonNull String propertyName) {\n// 如果逐步构建过程中mValues可能为null。只记录propertyName,在setValues()调用时稍后使用。\nif (mValuesif (p == null) {\n p = new PropertyValuesHolder();\n p.valuesHolder = mValues[0];\n String oldName = valuesHolder.getPropertyName();\n valuesHolder.setPropertyName(propertyName);\n mValuesMap.remove(oldName);\n mValuesMap.put(propertyName, p); \ 由于您的输入超过了最大长度限制,因此我无法完成要求。请您提供少于90个字符的文本,以便我可以为您提供准确的修改。谢谢!会用新的PropertyValuesHolder来替换原来的。这里用了一个 HashMap 来存放 propertyName 和 PropertyValuesHolder 的映射星空体育网页版。如果propertyName 是 "translationX", 那么接着查看 setFloatValues() 方法。\n4、setFloatValues() 方法:\n@Override\npublic void setFloatValues(float... values){\n if(mValues == null

星空体育登录入口

星空体育手机版


星空体育官方

推荐文章

公众号