属性动画的XML实现

QuibblerQuibbler 2020-09-14 约 14 分钟 1832 次阅读

属性动画的XML实现

补间动画的四种动画都可以通过代码实现,也可以通过xml实现,详见《补间动画:Tween Animation》。属性动画也可以通过XML的方式快速实现。和Animation动画src/main/res/anim目录不同,Animator动画xml放在src/main/res/animator目录下。

1、ValueAnimator

<animator/>标签对应ValueAnimator属性动画。关于ValueAnimator详见《属性动画:ValueAnimator及其监听器》。

1.1、ValueAnimator XML标签

ValueAnimator的xml有哪些属性呢?一共如下八个。

<?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="属性动画时长"
        android:interpolator="插值器"
        android:repeatCount="动画重复次数"
        android:repeatMode="reverse|restart"
        android:startOffset="动画激活延时;对应代码中的startDelay(long delay)函数"
        android:valueFrom="初始动化值"
        android:valueTo="动画结束值;取值范围同样是float,int和color这三种类型的值"
        android:valueType="floatType|intType|pathType|colorType:valueFrom和valueTo的类型" />

1.2、示例

在src/main/res/animator目录下定义ValueAnimator动画

<?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1500"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:startOffset="100"
        android:valueFrom="0"
        android:valueTo="1"
        android:valueType="floatType" />

通过AnimatorInflater加载animator动画XML文件

ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);

ValueAnimator还是需要添加监听器在回调中实时的设置View

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float value = (float) animation.getAnimatedValue();
            //最好不要在这里创建对象,复用的对象移除调用栈外创建
            DecimalFormat decimalFormat = new DecimalFormat("0.00");
            mTextView.setText(decimalFormat.format(value));
        }
    });

设置完成之后就可以开始执行属性动画。

valueAnimator.start();

2、ObjectAnimator

<objectAnimator/>标签对应ObjectAnimator属性动画。关于ObjectAnimator详见《属性动画:ObjectAnimator基础》。

2.1、ObjectAnimator标签

<?xml version="1.0" encoding="utf-8"?>
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="动画时长"
        android:interpolator="interpolator"
        android:pathData="用于对ObjectAnimator中的属性进行动画处理的路径。"
        android:propertyName="对应属性名"
        android:propertyXName="被动画化为pathData的X坐标的属性的名称。"
        android:propertyYName="被动画化为pathData的Y坐标的属性的名称。"
        android:repeatCount="动画重复次数"
        android:repeatMode="restart|reverse"
        android:startOffset="动画延时"
        android:valueFrom="初始动化值"
        android:valueTo="动画结束值"
        android:valueType="floatType|intType||pathType|colorType" />

2.2、示例

先在res/animator/目录下创建ObjectAnimator动画XML文件,使用<objectAnimator/>标签

<?xml version="1.0" encoding="utf-8"?>
	<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
	    android:duration="1500"
	    android:interpolator="@android:anim/accelerate_interpolator"
	    android:propertyName="backgroundColor"
	    android:repeatCount="0"
	    android:repeatMode="restart"
	    android:startOffset="100"
	    android:valueFrom="@color/colorAccent"
	    android:valueTo="@color/colorPrimary"
	    android:valueType="colorType" />

通过AnimatorInflater加载并类型转换为ObjectAnimator

ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);

还没有设置对象target View,将该ObjectAnimator用于TextView,并开始

objectAnimator.setTarget(mTextView);
    objectAnimator.start();

3、AnimatorSet

<set/>标签对应AnimatorSet属性动画。关于AnimatorSet详见《属性动画集合:AnimatorSet》。

3.1、属性

AnimatorSet的XML文件只有一个属性android:ordering:together表示同时开始动画,sequentially表示逐个开始动画。

<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="together|sequentially">
        ...
    </set>

3.2、示例

AnimatorSet的XML中添加属性动画,但是这里有一个小问题:由于一次性加载整个动画文件,如果是ValueAnimator和ObjectAnimator混搭的AnimatorSet,那么其中的ValueAnimator就无法单独设置AnimatorUpdateListener而不起作用。

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="sequentially">
        
        <animator
            android:duration="1500"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:startOffset="100"
            android:valueFrom="0"
            android:valueTo="1"
            android:valueType="floatType" />
            
        <objectAnimator
            android:duration="1500"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:propertyName="backgroundColor"
            android:repeatCount="0"
            android:repeatMode="restart"
            android:startOffset="100"
            android:valueFrom="@color/colorAccent"
            android:valueTo="@color/colorPrimary"
            android:valueType="colorType" />
            
    </set>

加载XML定义的AnimatorSet属性动画集合

AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animator);

需要设置统一的target给其中的ObjectAnimator,至于AnimatorSet中的ValueAnimator就没办法再单独设置AnimatorUpdateListener。所以XML定义AnimatorSet最好还是全部都添加ObjectAnimator子动画。

animatorSet.setTarget(mTextView);
    animatorSet.start();

相关推荐

精选
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