一、ObjectAnimation
定义:ObjectAnimation是在动画执行的过程中通过不断更改设置View的属性值来实现动画的效果,所以要保证对应的属性之一定要有getter和setter方法,否则不会有动画效果。
Translate动画:
//小球从右边窗口移动到左边窗口在回到原点
private void translate(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
objectAnimator.start();
}
注意:动画设置的属性值以小球中点为为原点。X轴上右边为正,左边为负;Y轴上上边为负,下边为正。
Scale动画:
//将小球缩小到1/2,再放大到2倍,再还原
private void scale(){
//通过PropertyValueHolder方式
PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX",1.0f,0.5f,2.0f,1.0f);
PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1.0f,0.5f,2.0f,1.0f);
ObjectAnimator.ofPropertyValuesHolder(ball,scaleX,scaleY).setDuration(2000).start();
//通过AnimatorSet方式
// ObjectAnimator scaleX=ObjectAnimator.ofFloat(ball,"scaleX",1.0f,0.5f,2.0f,1.0f);
// ObjectAnimator scaleY=ObjectAnimator.ofFloat(ball,"scaleY",1.0f,0.6f,2.0f,1.0f);
// AnimatorSet animatorSet=new AnimatorSet();
// animatorSet.setDuration(2000);
// animatorSet.setInterpolator(new LinearInterpolator());
// animatorSet.playTogether(scaleX,scaleY);
// animatorSet.start();
}
Alpha动画:
//使球先淡出在淡入
private void alpha(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"alpha",1.0f,0.0f,1.0f);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.start();
}
Rotate动画:
//使小球翻转一周
private void rotateX(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"rotationX",0.0f,360f);
objectAnimator.setDuration(3000);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.start();
}
二、ValueAnimator
定义:ValueAnimator通过监听动画改变的值,手动设置View的属性产生动画效果。
//ValueAnimator动画
private void valueAnimator(){
ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,ScreenUtil.getSreenWidth(this)/2);
valueAnimator.setDuration(2000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value= (float) valueAnimator.getAnimatedValue();
ball.setTranslationX(value);
ball.setTranslationY(value);
}
});
valueAnimator.start();
}
三、自定义TypeEvaluator
通过自定义实体类记录动画变化的值,然后在监听里获得动画变化的值,改变View的属性。
自定义实体类:
package com.gyg.animation;
/**
* Created by gyg on 2017/3/5.
*/
public class AnimatorEntity {
private float x;
private float y;
public AnimatorEntity() {
}
public AnimatorEntity(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
//自定义TypeEvaluator
private void customEvaluator(){
ValueAnimator valueAnimator=new ValueAnimator();
valueAnimator.setDuration(2000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setObjectValues(new AnimatorEntity(0,0));
valueAnimator.setEvaluator(new TypeEvaluator<AnimatorEntity>() {
@Override
public AnimatorEntity evaluate(float fraction, AnimatorEntity animatorEntity, AnimatorEntity t1) {
AnimatorEntity entity=new AnimatorEntity();
entity.setX(200 * fraction * 3);
entity.setY(0.5f * 200 * (fraction * 3) * (fraction * 3));
return entity;
}
});
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
AnimatorEntity entity= (AnimatorEntity) valueAnimator.getAnimatedValue();
ball.setX(entity.getX());
ball.setY(entity.getY());
}
});
valueAnimator.start();
}
四、给动画设置监听
//给动画设置监听
private void AnimatorListener(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {//动画开始时执行
Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT);
}
@Override
public void onAnimationEnd(Animator animator) {//动画结束时执行
Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT);
}
@Override
public void onAnimationCancel(Animator animator) {//动画取消时执行
Toast.makeText(MainActivity.this,"onAnimationV",Toast.LENGTH_SHORT);
}
@Override
public void onAnimationRepeat(Animator animator) {//动画重复时执行
Toast.makeText(MainActivity.this,"onAnimationRepeat",Toast.LENGTH_SHORT);
}
});
objectAnimator.start();
}
还有一种简单的适配器AnimatorListenerAdapter,可以根据需要重写里面的方法。比如我只想监听动画开始和结束:
//给动画设置监听
private void AnimatorListenerSimple(){
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball,"translationX", ScreenUtil.getSreenWidth(this)/2,0,-ScreenUtil.getSreenWidth(this)/2,0);
objectAnimator.setDuration(2000);//设置动画执行时间为1000毫秒
objectAnimator.setInterpolator(new LinearInterpolator());//设置动画匀速执行
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animator) {//动画开始时执行
Toast.makeText(MainActivity.this,"onAnimationStart",Toast.LENGTH_SHORT);
}
@Override
public void onAnimationEnd(Animator animator) {//动画结束时执行
Toast.makeText(MainActivity.this,"onAnimationEnd",Toast.LENGTH_SHORT);
}
});
objectAnimator.start();
}
五、Xml方式设置动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together"
><!--togerther表示一起执行 sequentially表示按照先后顺序依次执行-->
<!--x轴方向缩小0.5倍-->
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="0.5" >
</objectAnimator>
<!--y轴方向缩小0.5倍-->
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="0.5" >
</objectAnimator>
</set>
//xml方式定义动画
private void AnimationXml(){
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.anim_scale);
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(1000);
animator.setTarget(image);
image.setPivotX(0);
image.setPivotY(0);
image.invalidate();//通过设置pivotX,pivotY使image以左上角为中心缩放
animator.start();
}