属性动画:ObjectAnimator

QuibblerQuibbler 2020-09-09 约 15 分钟 2082 次阅读

属性动画:ObjectAnimator

上一篇介绍的属性动画:ValueAnimator较为简单,会发现只能基于数值的变化对View进行设置,而且只能通过给ValueAnimator添加AnimatorUpdateListener监听器来监听数值变化,进而在回调方法中根据实时变化的数值设置View的属性。继续介绍属性动画中另一个更复杂的Animator,不再需要实现ValueAnimator.AnimatorUpdateListener,因为动画属性会自动更新。

1、ObjectAnimator简介

“ObjectAnimator是ValueAnimator的子类。提供对目标对象的动画设置的支持。此类的构造函数使用参数来定义将被动画化的目标对象以及将被动画化的属性的名称。然后在内部确定适当的set/get函数,动画将在必要时调用这些函数来设置属性动画。”

使用ObjectAnimator的时候,操作的属性必须有get和set方法,否则无法生效,所以对于没有set和get方法的属性,开发者可以自定义包装一个set和get属性。

ObjectAnimator支持使用PropertyValuesHolder和Keyframe在资源文件中创建更复杂的动画。使用PropertyValuesHolders可使动画师并行制作多个属性的动画。

2、Animator原理

详见Animator属性动画源码一文。


3、方法介绍

ObjectAnimator继承自ValueAnimator,因此ValueAnimator中的方法都可以使用。详细使用方法以后介绍,有一些高级的方法涉及到Property、PropertyValuesHolder、TypeEvaluator后面单独介绍详细使用。

3.1、of方法

①ObjectAnimator ofArgb (Object target, String propertyName, int... values)

②ObjectAnimator ofArgb (T target, Property<T, Integer> property, int... values)

③ObjectAnimator ofFloat (Object target,String xPropertyName, String yPropertyName, Path path)

④ObjectAnimator ofFloat (T target, Property<T, Float> property, float... values)

⑤ObjectAnimator ofFloat (T target, Property<T, Float> xProperty, Property<T, Float> yProperty, Path path)

⑥ObjectAnimator ofFloat (Object target, String propertyName, float... values)

⑦ObjectAnimator ofInt (T target, Property<T, Integer> xProperty, Property<T, Integer> yProperty, Path path)

⑧ObjectAnimator ofInt (T target, Property<T, Integer> property,int... values)

⑨ObjectAnimator ofInt (Object target,String propertyName, int... values)

⑩ObjectAnimator ofInt (Object target, String xPropertyName,String yPropertyName, Path path)

⑪ObjectAnimator ofMultiFloat (Object target, String propertyName, float[][] values)

⑫ObjectAnimator ofMultiFloat (Object target, String propertyName, Path path)

⑬ObjectAnimator ofMultiFloat (Object target, String propertyName, TypeConverter<T, float[]> converter, TypeEvaluator<T> evaluator, T... values)

⑭ObjectAnimator ofMultiInt (Object target, String propertyName, int[][] values)

⑮ObjectAnimator ofMultiInt (Object target, String propertyName, TypeConverter<T, int[]> converter, TypeEvaluator<T> evaluator, T... values)

⑯ObjectAnimator ofMultiInt (Object target, String propertyName, Path path)

⑰ObjectAnimator ofObject (T target, Property<T, P> property, TypeConverter<V, P> converter, TypeEvaluator<V> evaluator, V... values)

⑱ObjectAnimator ofObject (T target, Property<T, V> property, TypeEvaluator<V> evaluator, V... values)

⑲ObjectAnimator ofObject (Object target, String propertyName, TypeConverter<PointF, ?> converter, Path path)

⑳ObjectAnimator ofObject (Object target, String propertyName, TypeEvaluator evaluator, Object... values)

㉑ObjectAnimator ofObject (T target, Property<T, V> property, TypeConverter<PointF, V> converter, Path path)

㉒ObjectAnimator ofPropertyValuesHolder (Object target, PropertyValuesHolder... values)

3.2、set方法

①setAutoCancel(boolean cancel)

②ObjectAnimator setDuration(long duration)

③setFloatValues(float... values)

④setIntValues(int... values)

⑤setObjectValues(Object... values)

⑥setProperty(Property property)

⑦setPropertyName(String propertyName)

⑧setTarget(Object target)

⑨setupEndValues()

⑩setupStartValues()

3.3、get方法

        ①getNameForTrace():返回此动画制作器的名称以进行调试,框架调用,开发无法调用因为默认包访问权限

②getPropertyName():获取将设置动画的属性的名称,即构造传入的propertyName参数

③Object getTarget():动画对象

3.4、其它方法

①start():开始ObjectAnimator属性动画

②ObjectAnimator clone():克隆一个一模一样的ObjectAnimator实例

4、示例

用ObjectAnimator实现四种补间动画:旋转、平移、放缩、透明度。

4.1、alpha

①使用ofInt()方法获取ObjectAnimator实例:设置ImageView的 "alpha" 透明度属性,内部会通过反射调用setAlpha方法。

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "alpha", 0.3f, 1.0f);

②设置TypeEvaluator估值器

objectAnimator.setEvaluator(new FloatEvaluator());

③其它一些设置,之后start()开始属性动画

objectAnimator.setDuration(1500);

4.2、translate

通用,只需要修改第二个参数propertyName,修改为“translationX”,就会在ObjectAnimator属性动画执行的时候调用对应的setTranslationX()方法

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 0, 400);
    objectAnimator.setEvaluator(new FloatEvaluator());
    objectAnimator.setDuration(1500);
    objectAnimator.start();

4.3、rotate

View的旋转动效,只需要调用setRotation()方法,传入对应的“rotation”属性名即可。

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "rotation", 0, 360);
    objectAnimator.setEvaluator(new FloatEvaluator());
    objectAnimator.setInterpolator(new BounceInterpolator());
    objectAnimator.setDuration(1500);
    objectAnimator.start();

4.4、scale

放缩有X、Y轴两个方向,要想达到同时放缩的效果,需要借助Animator属性动画集合,构造两个ObjectAnimator属性动画,分别设置"scaleX"、"scaleY",然后借助AnimatorSet的playTogether(Animator... items)将若干个动画组合,最后一起播放。关于Animator后面单独介绍。

AnimatorSet animatorSet = new AnimatorSet();
    
    ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(mImageView, "scaleX", 1f, 1.3f);
    ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(mImageView, "scaleY", 1f, 1.3f);
    objectAnimatorX.setEvaluator(new FloatEvaluator());
    objectAnimatorY.setEvaluator(new FloatEvaluator());
    
    animatorSet.setInterpolator(new AnticipateOvershootInterpolator());
    animatorSet.setDuration(1500);
    
    animatorSet.playTogether(objectAnimatorX, objectAnimatorY);
    animatorSet.start();

因为属性动画设置的是View的真实属性,所以动画呈现的效果也是View的真实属性,可以在动画结束的位置点击,操作。关于ObjectAnimator属性动画,还有TypeEvaluator、AnimatorSet、Property、PropertyValuesHolder等相关的类后面再继续了解。

相关博客:

         Docs > Reference > ObjectAnimator">Android Developers > Docs > Reference > ObjectAnimator

        Animate using ObjectAnimator

        Android 属性动画框架 ObjectAnimator、ValueAnimator

        ObjectAnimator动画的使用

        Animation动画——ObjectAnimator基本使用

        ObjectAnimator属性动画源码分析篇

        

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w