自定义圆:
public class Yuan extends View{
public static final float RADIUS=50f;
private Point currentPoint;
private circleColor currentColor;
private Paint paint=new Paint();
public Yuan(Context context) {
super(context);
}
public Yuan(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public Yuan(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//确定控件的位置和颜色
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (currentPoint==null){
currentColor=new circleColor(Color.BLUE);
paint.setColor(currentColor.getColor());
currentPoint=new Point(RADIUS,RADIUS);
canvas.drawCircle(currentPoint.getX(),currentPoint.getY(),RADIUS,paint);
starAnim();
}else {
paint.setColor(currentColor.getColor());
canvas.drawCircle(currentPoint.getX(),currentPoint.getY(),RADIUS,paint);
}
}
//开始设计动画的效果
private void starAnim() {
Point startPoint=new Point(RADIUS,RADIUS);
Point endPoint=new Point(getWidth()-RADIUS,getHeight()-RADIUS);
final ValueAnimator value=ValueAnimator.ofObject(new PointEvaluator(),startPoint,endPoint);
value.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if (animation!=null){
currentPoint=(Point)animation.getAnimatedValue();
invalidate();
}
}
});
}
//自己定义的模式里面计算开始到结束,原点和颜色的差值
class PointEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoin=(Point)startValue;
Point endPoin=(Point)endValue;
float x = startPoin.getX() + fraction * (endPoin.getX() - startPoin.getX());
float y = startPoin.getY() + fraction * (endPoin.getY() - startPoin.getY());
return new Point(x,y);
}
}
class ColorEvalustor implements TypeEvaluator{
int count;
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
circleColor startColor=(circleColor)startValue;
circleColor endColor=(circleColor)endValue;
int alpha=(int)(Color.alpha(startColor.getColor())+fraction*(Color.alpha(endColor.getColor())-Color.alpha(startColor.getColor())));
int red=(int)(Color.red(startColor.getColor())+fraction*(Color.red(endColor.getColor())-Color.red(startColor.getColor())));
int green=(int)(Color.green(startColor.getColor())+fraction*(Color.green(endColor.getColor())-Color.green(endColor.getColor())));
int blue=(int)(Color.blue(startColor.getColor())+fraction*(Color.blue(endColor.getColor())-Color.blue(endColor.getColor())));
return new circleColor(Color.argb(alpha,red,green,blue));
}
}
public class circleColor{
private int color;
@Override
public String toString() {
return "circleColor{" +
"color=" + color +
'}';
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public circleColor(int color) {
this.color = color;
}
}
public class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", 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;
}
}
}
布局:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bwei.yuekao.MainActivity">
<com.bwei.yuekao.Yuan
android:id="@+id/yuan"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Yuan yuan= (Yuan) findViewById(R.id.yuan);
ValueAnimator valueAnimator=new ValueAnimator();
valueAnimator.setDuration(5000);
valueAnimator.setObjectValues(new PointF(0,0));
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setEvaluator(new TypeEvaluator<PointF>()
{
@Override
public PointF evaluate(float v, PointF pointF, PointF t1) {
PointF point=new PointF();
point.x=200*v*3;
point.y=0.5f*200*(v*3)*(v*3);
return point;
}
});
valueAnimator.start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator)
{
PointF point= (PointF) valueAnimator.getAnimatedValue();
yuan.setX(point.x);
yuan.setY(point.y);
}
});
//判断动画是否结束
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
//动画结束之后的逻辑
Intent intent=new Intent(MainActivity.this,TwoActivity.class);
startActivity(intent);
finish();
}
});
}
}