package yifeiyuan.practice.practicedemos.reveal; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.LinearInterpolator; import yifeiyuan.practice.practicedemos.R; /** * Created by yifeiyuan on 15/7/1. */ public class RevealView extends View { public static final String TAG = "RevealView"; public RevealView(Context context) { super(context); init(); } public RevealView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public RevealView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(getResources().getColor(R.color.primary_dark)); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); } private Paint mPaint; private int radius; public void startReveal() { setVisibility(VISIBLE); //计算对角线 sqrt 开平方,pow 计算x的n次方 int maxRadius = (int) (Math.sqrt(Math.pow(getHeight(), 2)+ Math.pow(getWidth(), 2))); ObjectAnimator revealAnimator = ObjectAnimator.ofInt(this, "radius", 0,maxRadius).setDuration(300); revealAnimator.setInterpolator(new AccelerateInterpolator()); revealAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (null != callback) { callback.onRevealEnd(); } } }); revealAnimator.start(); } /** * 可以做成loading效果~~ */ public void startLoading() { ObjectAnimator revealAnimator = ObjectAnimator.ofInt(this, "radius", 20, 50); revealAnimator.setRepeatMode(ValueAnimator.REVERSE); revealAnimator.setInterpolator(new LinearInterpolator()); revealAnimator.setRepeatCount(ValueAnimator.INFINITE); revealAnimator.start(); //revealAnimator.cancel(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //原点是中心 canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mPaint); } public int getRadius() { Log.d(TAG, "getRadius ");//当属性动画不设置初始值时,get方法才会被调用 return radius; } public void setRadius(int radius) { this.radius = radius; Log.d(TAG, "setRadius "+radius); //Notice 调用invalidate 之后 onDraw才会被调用 invalidate(); } public void setCallback(Callback callback) { this.callback = callback; } private Callback callback; public interface Callback{ void onRevealEnd(); } }