前言
前几天学习了补间动画,最近比较忙,在加上学习属性动画的时候,一直学的比较慢,主要不太理解。边学边做Demo,终于对属性动画有了一个大概的理解,于是,在这里总结一下,也是对自己学习的一个总结。
属性动画简介
其实翻译Property Animation的时候,翻译成属性动画,其实就我自己的理解,属性动画的《属性》两个字就很简单明了,我们知道,一个View控件,包含很多属性,例如 alpha,scaleX,Y,rolateX,那么属性动画呢,就是控制这些属性按照我们的需要进行变化,满足我们的需求,这句话,直接理解肯定有点不明白,那么我们通过一个Demo来演示一下,我们控制ImageView这个控件的alpha属性,从不透明变化到透明,这就是控制属性(alpha)按照我们的需求(我们要求它从不透明到透明)进行变化。如图
看到这里,你是否会觉得然并卵呢!这和补间动画有多大的区别,补间动画都能做,干嘛用属性动画呢。反正当时,我在学习到属性动画的时候,也是这样想的,但是,你是否想过,如果Google真的会那么闲,那么Android也太low了,上面说过,属性动画的精髓在于属性二字,我们可以继承一个View,给它设置一个我们需要的属性,那么这个属性就可以受我们的控制了,这也就解释属性动画和补间动画有重叠,但是强于属性动画呢。因为补间动画,只能使用系统定义好的那些属性。
常用的方法
duration 这个很简单,就是控制动画的持续时间。
interpolator 动画插值,其实就是控制这个动画的速度变化,比如:
LinearInterpolator是匀速
AccelerateInterpolator是先减速后加速
DecelerateInterpolator是先加速后减速。
repeatCount 动画的重复次数
repeatMode 动画播放完后,是从开始到结尾,还是结尾到开始
ordering 控制播放的顺序
属性动画的继承关系:
我们可以看出来,Animator是基类,它的直接子类是ValueAnimator和AnimatorSet,它的间接子类是ObjectAnimator。
ValueAnimator 属性动画的时间引擎,负责计算每一帧的属性值,并且更新该属性值。
ObjectAnimator ValueAnimator的直接子类,封装了大量的方法,能够让我们极为简单的创建属性动画。
AnimatorSet 我们可以将它理解成一个动画剪辑师,它主要用于控制多个属性动画的播放顺序。
关于Evaluator计算器
什么是计算器: 要知道,我们创建属性动画肯定是希望利用单个或者多个属性的变化达到我们想要的效果。 为了自定义对象的属性的变化规律,Evaluator就应运而生了。 觉得晦涩没关系,下面会有Demo讲解。
下面是一些常用的计算器:
IntEvaluator: 用于计算int类型属性值的计算器
FloatEvaluator:用于计算Float类型属性值的计算器
ArgbEvaluator: 用于计算以16进制表示的颜色的计算器
TypeEvaluator: 自定义数据类型(除int,float,argb)外的数据类型的计算器。
下面以IntEvaluator计算器为例演示,制作一个Demo,要知道,我们:我们定义一个类(MyText)继承自TextView,增加一个Integer类型的account属性,我们要求这个account属性是100的整数倍。怎么实现呢?其中一种方法我们可以利用IntEvaluator计算器控制account的值来实现这个功能。
先看效果:
贴代码
JAVA:MyText
public class MyText extends TextView {
public MyText(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO 自动生成的构造函数存根
}
private int account;
public int getAccount() {
return account;
}
public void setAccount(int account) {
this.account = account;
}
}
Java:MainActivity
public class MainActivity extends Activity {
private MyText text;
private Button btn;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (MyText) findViewById(R.id.text);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ObjectAnimator animator = ObjectAnimator.ofInt(text, "account", 1, 10000);
animator.setDuration(30000);
animator.setInterpolator(new LinearInterpolator());
// 设置IntEvaluator计算器
animator.setEvaluator(new IntEvaluator() {
@Override
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
//保留小数点后两位
DecimalFormat decimalFormat = new DecimalFormat(".00");
String p = decimalFormat.format(fraction);
float a = Float.parseFloat(p);
// 因为保留是小数点后两位,那么*10000,返回的自然会100的整数。
return (int) (a * 10000);
}
});
animator.start();
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
String a = animation.getAnimatedValue().toString();
Log.v("SDFA", a);
text.setText(a);
text.invalidate();
}
});
}
});
}
}
小伙伴们知道Evaluator有什么用了吧,计算器的作用就是让随心所欲的控制属性,FloatEvaluator和ArgbEvaluator等计算器,只是支持的数据类型不一样而已
点击下载Demo
创建动画的方式<一>
使用ValueAnimator创建动画:
ValueAnimator animation = ValueAnimator.ofFloat(object, startVal, endVal);
animation.setDuration(1000);
animation.start();
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// ....操作省略
text.invalidate();
}
});
前面说过,使用ObjectAnimator会跟简单,那是怎么个简单法呢。
使用ObjectAnimator创建动画:
ObjectAnimator animator = ObjectAnimator.ofInt(object, startVal, endVal);
animator.setDuration(1000);
animator.start();
对比发现,使用ObjectAnimator 我们不用注册监听器,因为像alpha,scaleX等是系统已经定义好了的。但是,如果是自定义属性,需要提供setter和getter方法,并且添加addUpdateListener监听方法,在onAnimationUpdate()方法中显示调用View.invalidate()方法。
创建动画的方式<二>
上面介绍的采用方法是利用静态工厂方式来创建的,我们接下来探讨使用XML资源来实现。实现起来和补间动画的方式大致一样。
XML资源代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
// sequentially 控制播放循序。
// android:ordering="together" 同时播放
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="5"
android:valueTo="1" >
</objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="scaleY"
android:valueFrom="5"
android:valueTo="1" >
</objectAnimator>
<objectAnimator
android:duration="2000"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0" >
</objectAnimator>
</set>
总结
这篇博文更新时间花费有点长,在草稿箱里写了又改好几次,其实,其实想了一下,主要是惰性在作怪,其实,人啊,控制自己的惰性就是对自己的一个挑战。真正的大牛不是比你聪明多少,而是比你努力了更多。其实,感觉,赚钱不是那么难的,你就直接把一门技术学好,自然就赚钱了,但是。。。。。
技术因分享而饱含生机