注意:其中播放多个动画使用的是AnimatorSet不是AnimationSet
AnimatorSet 和 AnimationSet 都是动画集合
AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类
Animation:一般动画,改变的是View的显示内容,View不会变(如ImageView平移,ImageView的位置不会改变,改变的是ImageView中的图片位置)
Animator:属性动画,改变的是View的属性(如ImageView平移,ImageView的x,y将会改变)
package prictise.lxm.prictise;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加动画视图
LinearLayout linerMain = (LinearLayout)findViewById(R.id.linea_main);
linerMain.addView(new MyAnimationView(this));
}
/**
* 球类
*/
class ShapeHolder{
float x =0,y=0;
int alpha=255;
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;
}
public int getAlpha() {
return alpha;
}
public void setAlpha(int alpha) {
this.alpha = alpha;
}
public ShapeDrawable getShapeDrawable() {
return shapeDrawable;
}
public void setShapeDrawable(ShapeDrawable shapeDrawable) {
this.shapeDrawable = shapeDrawable;
}
ShapeDrawable shapeDrawable;
public ShapeHolder(ShapeDrawable shapeDrawable){
this.shapeDrawable = shapeDrawable;
}
}
/**
* 动画
*/
class MyAnimationView extends View implements ValueAnimator.AnimatorUpdateListener{
final int BALL_SIZE = 30;
final int FULL_TIME = 1000;//从屏幕顶端落到屏幕第所用时间ms
ArrayList<ShapeHolder> shapeHolders = new ArrayList<ShapeHolder>(); //球集合
public MyAnimationView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
}
//记录上一次画球的位置
float oldDrawX;
float oldDrawY;
final int MOVE_LENGTH = 40; //移动多少位置后画球
/**
* 在手指点击,或移动位置位置掉球
* @param event
* @return
*/
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_MOVE){ //移动时,按条件画图
float dx = event.getX() - oldDrawX;
float dy = event.getY() - oldDrawY;
double moveLength = Math.sqrt( dx*dx + dy*dy);
if(moveLength < MOVE_LENGTH){ //移动位置太短,不画球
return true;
}
}else if(event.getAction() != MotionEvent.ACTION_DOWN){ //不是按下,不画球
return true;
}
oldDrawX = event.getX();
oldDrawY = event.getY();
int screenHeight = getHeight();
//生成新的球
final ShapeHolder newBall = addBall(event.getX(),event.getY());
//让球向下移动(改变y值)
int duration = (int)(FULL_TIME * (screenHeight-event.getX())/screenHeight);
ObjectAnimator objAnimY = ObjectAnimator.ofFloat(newBall,"y",screenHeight-BALL_SIZE);//y从当前值变为screenHeight-BALL_SIZE
objAnimY.setDuration(duration); //设置动画运行时间
objAnimY.setInterpolator(new AccelerateInterpolator()); //设置动画变速方式为 加速度
objAnimY.addUpdateListener(this); //添加值改变监听器
//让球慢慢隐藏(改变alpha值)
ObjectAnimator objAnimAlpha = ObjectAnimator.ofInt(newBall, "alpha",255,0); //从255变为0
objAnimAlpha.setDuration(duration);
objAnimAlpha.addUpdateListener(this);
objAnimAlpha.addListener(new AnimatorListenerAdapter() { //添加监听,当动画结束时移除球
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
shapeHolders.remove(newBall);
}
});
//播放动画,两个动画下移在透明度更改之前
AnimatorSet animatorSet = new AnimatorSet(); //注:此处为AnimatorSet 不是AnimationSet
animatorSet.play(objAnimY).before(objAnimAlpha);
animatorSet.play(objAnimAlpha);
animatorSet.start();
return true;
}
@Override
/**
* 重画视图
*/
public void onAnimationUpdate(ValueAnimator animation) {
invalidate();
}
/**
* 画球
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for(ShapeHolder shapeHolder: shapeHolders){
//保存画布当前位置
canvas.save();
//移动球位置
canvas.translate(shapeHolder.getX(), shapeHolder.getY());
//改变球的透明度
shapeHolder.getShapeDrawable().setAlpha(shapeHolder.alpha);
shapeHolder.getShapeDrawable().draw(canvas);
//还原画布位置
canvas.restore();
}
}
/**
* 添加球
* @param x 球的位置x
* @param y 球的位置y
* @return
*/
private ShapeHolder addBall(float x,float y){
//创建一个圆
OvalShape ovalShape = new OvalShape();
ovalShape.resize(BALL_SIZE,BALL_SIZE);
//包装成Drawable
ShapeDrawable shapeDrawable = new ShapeDrawable(ovalShape);
//创建shapeHolder对象
ShapeHolder shapeHolder = new ShapeHolder(shapeDrawable);
shapeHolder.setX(x-BALL_SIZE/2);
shapeHolder.setY(y-BALL_SIZE/2);
//随机生成渐变色
int red = (int)(Math.random() *255);
int green = (int)(Math.random() *255);
int blue = (int)(Math.random() *255);
int startColor = Color.argb(0xff,red,green,blue);
int endColor = Color.argb(0xff,red/4,green/4,blue/4);
//设置圆形渐变
RadialGradient radialGradient = new RadialGradient(BALL_SIZE/2,BALL_SIZE/2,BALL_SIZE,startColor,endColor, Shader.TileMode.CLAMP);
shapeDrawable.getPaint().setShader(radialGradient);
shapeHolders.add(shapeHolder);
return shapeHolder;
}
}
}