属性动画从Android3.0开始推出来的,与补间动画的不同,属性动画是真实改变了控件的属性。下面是多种属性动画并行和自定义估值器EvaluatorType实现的抛物线动画,高中物理公式s=1/2*g*t*t;
1.首先看前面三个radiation的点击动画,里面有alpha和scale动画,这里列举了三种方式实现动画并发
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
final RadioButton btn = (RadioButton) group.findViewById(checkedId);
//第一种方式
/* ObjectAnimator animator = new ObjectAnimator();
animator.setFloatValues(1.0f, 0.5f, 1.0f);
animator.setPropertyName("alpha");
animator.setDuration(500);
animator.setTarget(btn);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value= (float) animation.getAnimatedValue();
btn.setScaleX(value);
btn.setScaleY(value);
}
});
animator.start();*/
第二种实现方式:
/* PropertyValuesHolder holder1=PropertyValuesHolder.ofFloat("alpha",1.0f,0.5f,1.0f);
PropertyValuesHolder holder2=PropertyValuesHolder.ofFloat("scaleX",1.0f,0.5f,1.0f);
PropertyValuesHolder holder3=PropertyValuesHolder.ofFloat("scaleY",1.0f,0.5f,1.0f);
ObjectAnimator objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btn,holder1,holder2,holder3);
objectAnimator.setDuration(500);
objectAnimator.start();*/
第三种实现方式:
ObjectAnimator objectAnimator1=new ObjectAnimator().ofFloat(btn,"alpha",1.0f,0.5f,1.0f);
ObjectAnimator objectAnimator2=new ObjectAnimator().ofFloat(btn,"scaleX",1.0f,0.5f,1.0f);
ObjectAnimator objectAnimator3=new ObjectAnimator().ofFloat(btn,"scaleY",1.0f,0.5f,1.0f);
AnimatorSet set=new AnimatorSet();
set.setDuration(500);
set.playTogether(objectAnimator1,objectAnimator2,objectAnimator3);
set.start();
注意:属性动画可以做颜色过渡动画,源码扣初来的片段如下
public static ValueAnimator ofArgb(int... values) {
ValueAnimator anim = new ValueAnimator();
anim.setIntValues(values);
anim.setEvaluator(ArgbEvaluator.getInstance());
return anim;
}
下面是抛物线动画实现,主要是估值器的使用,重写估值计算规则
//自定义估值器,重写计算规则
class MyEvaluator implements TypeEvaluator<PointF> {
public MyEvaluator() {
}
/**
* @param fraction 动画执行了的百分比,
* @param startValue 点的起始值
* @param endValue 点的最终值
* @return
*/
@Override
public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
//抛物线方程式 s=1/2*g*t*t
//定义初速度150,加速g=9.8,时间t=5s,就是动画设置的执行时间
float t = 5 * fraction*1.0f;
PointF pointF = new PointF();
pointF.x = 150 * t;
pointF.y = 0.5f * 98.0f * t * t;
return pointF;
}
}
前面上述三种动画并发的第一种方式,设置vaules可以设置point,并且再updatelistener中不断的改变view的位置,代码如下:
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ValueAnimator animator = new ValueAnimator();
MyEvaluator evaluator = new MyEvaluator();
animator.setDuration(5000);
//第一.先设置value
animator.setObjectValues(new PointF(0,0));
//第二.再设置估值器
animator.setEvaluator(evaluator);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pointF = (PointF) animation.getAnimatedValue();
//通过不断的改变view的坐标来实现抛物线动画
image.setX(pointF.x);
image.setY(pointF.y);
}
});
animator.start();
}
注意:1.@param fraction 动画执行了的百分比,这个百分比是匀速返回的。
2. animator.setObjectValues();和animator.setEvaluator()
的先后顺序不能反,先设置值,再设置估值器,否则会不具体报空指针异常。
3. 总结:以后可以利用估值器实现更多的曲线动画,比如贝塞尔、正弦余弦动画等。