本文将介绍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同时也会以动画方式进行调整。