package com.sandro.custom.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.os.Handler; import android.util.AttributeSet; import android.view.View; @SuppressLint("DrawAllocation") public class CircleView extends View{ private Handler mHandler; private RectF oval; private Paint mPaints; private float mSweep; /** * 静止状态 */ private static final int STOP = 0; /** * 画圆状态 */ private static final int DRAW_CIRCLE = 1; /** * 园的扩散状态 */ private static final int DRAW_SPREAD = 2; private int anim_status = STOP; private static final long CIRCLE_TIME = 400l; private long startTime; private static final int POS_SIZE = 60; private int alpha = 255; private int size = POS_SIZE; public CircleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public CircleView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CircleView(Context context) { super(context); init(); } public void setHandler(Handler handler){ this.mHandler = handler; } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); oval = new RectF(POS_SIZE, POS_SIZE, this.getWidth()-POS_SIZE, this.getHeight()-POS_SIZE); } private void init(){ mPaints = new Paint(); mPaints.setAntiAlias(true); mPaints.setStyle(Paint.Style.STROKE); mPaints.setStrokeWidth(1f); mPaints.setColor(0xffffffff); } public void startCircleDraw(){ startTime = System.currentTimeMillis(); anim_status = DRAW_CIRCLE; this.invalidate(); } @Override protected void onDraw(Canvas canvas) { drawCircleAnim(canvas); } private void prepareSpread(){ anim_status = DRAW_SPREAD; size = POS_SIZE; alpha = 255; } public void startSpread(){ prepareSpread(); this.invalidate(); } private void drawCircleAnim(Canvas canvas){ switch(anim_status){ case DRAW_CIRCLE: long time = System.currentTimeMillis() - this.startTime; if(time<CIRCLE_TIME){ mSweep = (time * 360 /CIRCLE_TIME); canvas.drawArc(oval, 270, mSweep, false, mPaints); }else{ prepareSpread(); canvas.drawArc(oval, 270, 360, false, mPaints); mHandler.sendEmptyMessage(AppScanCircleLayout.MSG_DRAW_CIRCLE_FINISH); } this.invalidate(); break; case DRAW_SPREAD: if(size>0){ size -=3; alpha -=10; mPaints.setARGB(alpha, 255, 255, 255); oval = new RectF(size, size, this.getWidth()-size, this.getHeight()-size); canvas.drawArc(oval, 270, 360, false, mPaints); this.invalidate(); } break; } } }