Android 属性动画
为什么还要引入属性动画呢?
1,可扩展性好,例如除了上述四种情况,还可以实现改变背景色等很多复杂的动画。
2,不仅仅改变效果,而是真正改变了组件的属性。
属性动画概述
Android 3.0 以后引入了属性动画,属性动画实现原理就是修改控件的属性值来实现动画。
属性动画可以实现许多 View(补间) 动画做不到的事.
属性动画组成部分、相关类介绍:
- ObjectAnimator :对象动画执行类。
- ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。
- PropertyValuesHolder : 属性存储器,为两个执行类提供更新多个属性的功能。
- Keyframe :为 PropertyValuesHolder提供多个关键帧的操作值。
- AnimatorSet :一组动画的执行集合类:设置执行的先后顺序,时间等。
- AnimatorUpdateListener :动画更新监听。
- AnimatorListener :动画执行监听,在动画开始、重复、结束、取消时进行回调。
- AnimatorInflater :加载属性动画的xml文件。
- TypeEvaluator :类型估值,用于设置复杂的动画操作属性的值。
- TimeInterpolator :时间插值,用于控制动画执行过程。
propertyName:
//1、透明度:alpha
public void setAlpha(float alpha)
//2、旋转度数:rotation、rotationX、rotationY
public void setRotation(float rotation)
public void setRotationX(float rotationX)
public void setRotationY(float rotationY)
//3、平移:translationX、translationY
public void setTranslationX(float translationX)
public void setTranslationY(float translationY)
//缩放:scaleX、scaleY
backgroundColor
public void setScaleX(float scaleX)
public void setScaleY(float scaleY)
ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。在封装成PropertyValuesHolder实例以后,后期的各种操作也是以PropertyValuesHolder为主的。
属性存储器关联到 ObjectAnimator :
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(tv_textview,propertyValuesHolder,propertyValuesHolderA
,propertyValuesHolderC,propertyValuesHolderH,propertyValuesHolderT,propertyValuesHolderS);
fraction 从起始值到结束值的分数,即为根据时间变化的浮点数,从0到1
代码实现
// An highlighted block
package com.bawei.animtiondemoday02;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AnticipateInterpolator;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.bawei.animtiondemoday02.app.MyTypeEvaluator;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
@ContentView(R.layout.activity_property)
public class PropertyActivity extends Activity {
@ViewInject(R.id.tv_1702)
private TextView tv_1702;
int count = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
tv_1702.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(PropertyActivity.this, "我被点击了", Toast.LENGTH_SHORT).show();
}
});
}
@Event(value = {R.id.bt_alpha_property,R.id.bt_rotate_property,R.id.bt_scale_property,R.id.bt_translate_property,
R.id.bt_coloe_property,R.id.bt_set_property},type = View.OnClickListener.class)
private void click(View view){
switch (view.getId()){
case R.id.bt_alpha_property:
alphaProperty();
break;
case R.id.bt_rotate_property:
rotateProperty();
break;
case R.id.bt_scale_property:
scaleProperty();
break;
case R.id.bt_translate_property:
translateProperty();
break;
case R.id.bt_coloe_property:
coloeProperty();
break;
case R.id.bt_set_property:
setProperty();
break;
}
}
//属性动画的集合显示
private void setProperty() {
// ObjectAnimator objectAnimatorC = ObjectAnimator.ofInt(tv_1702,"backgroundColor", Color.BLUE,Color.RED);
// ObjectAnimator objectAnimatorT = ObjectAnimator.ofFloat(tv_1702,"translationY",0,200);
// ObjectAnimator objectAnimatorS = ObjectAnimator.ofFloat(tv_1702,"scaleX",1f,3f);
// ObjectAnimator objectAnimatorR = ObjectAnimator.ofFloat(tv_1702,"rotation",0,360);
// ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(tv_1702,"alpha",1,0);
//
// //属性动画集合
// AnimatorSet animatorSet = new AnimatorSet();
//
// animatorSet.setDuration(8000);
// //play 开始执行属性动画 with 和评级的一起执行 before在play之前的动画执行 after是在play之后执行
// animatorSet.play(objectAnimatorC).with(objectAnimatorR).before(objectAnimatorA).after(objectAnimatorS).with(objectAnimatorT);
// animatorSet.start();
//使用属性存储器 来保存属性动画的属性
// PropertyValuesHolder propertyValuesHolderC = PropertyValuesHolder.ofInt("backgroundColor", Color.YELLOW, Color.RED);
// PropertyValuesHolder propertyValuesHolderT = PropertyValuesHolder.ofFloat("translationY",0,200);
// PropertyValuesHolder propertyValuesHolderS = PropertyValuesHolder.ofFloat("scaleX",1,3);
// PropertyValuesHolder propertyValuesHolderR = PropertyValuesHolder.ofFloat("rotation",0,360);
// PropertyValuesHolder propertyValuesHolderA = PropertyValuesHolder.ofFloat("alpha",0,200);
//
//
// ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(tv_1702, propertyValuesHolderC, propertyValuesHolderT, propertyValuesHolderS, propertyValuesHolderR
// , propertyValuesHolderA);
//
// objectAnimator.setDuration(5000);
// objectAnimator.setRepeatCount(3);
// objectAnimator.start();
ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyTypeEvaluator(),1f,20f);
//值动画添加 动画更新监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//获取动画操作属性的值
Float animatedValue = (Float) valueAnimator.getAnimatedValue();
//每一次浮点数变动一下 我都更新了一次UI
tv_1702.setText(animatedValue+"");
}
});
valueAnimator.setDuration(5000);
valueAnimator.start();
}
//设置背景颜色的属性动画
private void coloeProperty() {
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(tv_1702,"backgroundColor", Color.BLUE,Color.RED);
objectAnimator.setDuration(5000);
//设置执行次数
objectAnimator.setRepeatCount(3);
objectAnimator.start();
}
//平移属性动画
private void translateProperty(){
//获取控件相对于Y轴位移
float translationY = tv_1702.getTranslationY();
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv_1702,"translationY",translationY,translationY+100);
objectAnimator.setDuration(5000);
objectAnimator.start();
}
//拉伸属性动画
private void scaleProperty() {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv_1702,"scaleX",1f,3f);
//设置执行时间
objectAnimator.setDuration(5000);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
//设置回复原位
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(tv_1702,"scaleX",3f,1f);
objectAnimator1.setDuration(5000);
objectAnimator1.start();
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
objectAnimator.start();
}
//旋转属性动画
private void rotateProperty() {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv_1702,"rotation",0,360);
objectAnimator.setDuration(5000);
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
objectAnimator.setInterpolator(new AnticipateInterpolator());
objectAnimator.start();
}
//加载xml文件 实现属性动画
private void alphaProperty(){
//创建属性动画
ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(PropertyActivity.this,R.animator.alpha);
//动画属性关联我们的view
valueAnimator.setTarget(tv_1702);
//设置执行时间 毫秒
valueAnimator.setDuration(5000);
valueAnimator.setRepeatCount(3);
//动画执行的次数
//
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
Toast.makeText(PropertyActivity.this, "开始", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationEnd(Animator animator) {
Toast.makeText(PropertyActivity.this, "结束", Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
Toast.makeText(PropertyActivity.this, " count = " + (count++), Toast.LENGTH_SHORT).show();
}
});
//启动属性动画
valueAnimator.start();
}
}