Android Property Animation 介绍(二)

本文将介绍property Animator的具体使用。同其他的动画实现一样,也支持xml设置和代码设置,也能够实现一组动画的执行。

来看下实例

xml的,android推荐在res/animator/目录下定义xml文件具体如下

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleX"
    android:duration="2000"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:repeatCount="1"
    android:repeatMode="reverse"
    />

可以看到使用的动画类是ObjectAnimator,定义的动画特性有duration持续时间为2000ms,repeatCount重试次数为1次,repeatMode重试模式为reverse倒退。propertyName修改的属性为scaleX,valueFrom,valueTo,此时表示从比例1到比例2

如果想要执行一组动画如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <objectAnimator
        android:propertyName="scaleX"
        android:duration="2000"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        android:repeatCount="1"
        android:repeatMode="reverse" />

    <objectAnimator
        android:propertyName="scaleY"
        android:duration="2000"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        android:repeatCount="1"
        android:repeatMode="reverse" />
</set>

代码中设置动画

设置单个动画的代码

scaleXAnimator = new ObjectAnimator();
        scaleXAnimator.setTarget(textView);
        scaleXAnimator.setPropertyName("scaleX");
        scaleXAnimator.setDuration(2000);
        scaleXAnimator.setRepeatCount(1);
        scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
        scaleXAnimator.setFloatValues(1,2);

设置一组动画的代码

 set = new AnimatorSet();
        scaleXAnimator = new ObjectAnimator();
        scaleXAnimator.setTarget(textView);
        scaleXAnimator.setPropertyName("scaleX");
        scaleXAnimator.setDuration(2000);
        scaleXAnimator.setRepeatCount(1);
        scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
        scaleXAnimator.setFloatValues(1, 2);

        scaleYAnimator = ObjectAnimator.ofFloat(textView,"scaleY",1,2);
        scaleYAnimator.setDuration(2000);
        scaleYAnimator.setRepeatCount(1);
        scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);

        set.playTogether(scaleXAnimator,scaleYAnimator);

还可以其他的方式来同时改变多个属性

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

    或是使用ViewPropertyAnimator

myView.animate().x(50f).y(100f);

还可以设置插值通过调用setInterpolator方法,android已经定义了一些插值器

AccelerateInterpolator:加速,开始慢中间加速

DecelerateInterpolator:减速,开始时块然后减速

AccelerateDecelerateInterolator:先加速后减速,开始结束时慢,中间加速

AnticipateInterpolator:反向,先向相反方向执行一段再加速播放

AnticipateOvershootInterpolator:反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动到目的值

BounceInterpolator:跳跃,快到目的值会跳跃,如目的值100.后面值可能依次为85,77,70,80,90,100

CycleIinterpolator:循环,动画循环一定次数,值得改变为宜正弦函数Math.sin(2*mCycles*Math.PI*input)

LinearInterpolator:线性,线性均匀改变

OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值

TimeInterpolator:一个接口,允许你自定义interpolator,以上都是实现了这个接口。

ViewGroup中的layout的动画

与view动画一样,property动画系统对Viewgroup对象的动画显示提供了支持。你可以用LayoutTransition类来动画显示Viewgroup中的layout。通过把View加入或移出ViewGroup,或者以VISIBLE、INVISIBLE、GONE调用View的setVisibility()方法,可以实现某个View的显现和消息效果。当你添加或删除View时,ViewGroup中的其他View也可以用动画的方式移动到新的位置显示。你可以调用LayoutTransition对象的setAnimator()方法来定义下载动画方式。调用参数是Animator对象和以下LayoutTransition常量:

APPEARING:元素在容器中显现时需要动画显示

CHANGE_APPEARING:由于容器中药显示一个新的元素,其他元素的变化需要动画显示

DISAPPEARING:元素在容器中消息时需要动画显示

CHANGE_DISAPPEARING:由于容器中某个元素要消失,其他元素的变化需要动画显示

你可以为这4种事件定义自己的动画方式,已便定制layout变化时的外观,也可以只是通知动画系统采用默认的动画方式。在xml中你只要为ViewGroup的android:animateLayoutchanges属性设为true,将会自动把view加入和移出的过程已动画方式显示,ViewGroup中其他的View同时也会以动画方式进行调整。







你可能感兴趣的:(Android Property Animation 介绍(二))