package com.partynetwork.iparty.ishare; import java.util.Timer; import java.util.TimerTask; import com.partynetwork.iparty.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; public class CircleProgress extends View { private static final int DEFAULT_MAX_VALUE = 100; // 默认进度条最大值 private static final int DEFAULT_PAINT_COLOR = Color.WHITE; // 默认画笔颜色 private static final int DEFAULT_INSIDE_VALUE = 0; // 默认缩进距离 private CircleAttribute mCircleAttribute; // 圆形进度条基本属性 private int mMaxProgress; // 进度条最大值 private int mMainCurProgress; // 主进度条当前值 private int mGoalProgress;// 目标值 private CartoomEngine mCartoomEngine; // 动画引擎 private Drawable mBackgroundPicture; // 背景图 public CircleProgress(Context context) { super(context); defaultParam(); } public CircleProgress(Context context, AttributeSet attrs) { super(context, attrs); defaultParam(); TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar); // 从xml获取属性值 mMaxProgress = array.getInteger(R.styleable.CircleProgressBar_max, DEFAULT_MAX_VALUE); // 获取进度条最大值 int textPaintColor = array.getColor( R.styleable.CircleProgressBar_textPaintColor, DEFAULT_PAINT_COLOR); // 获取画笔宽度 int mainPaintColor = array.getColor( R.styleable.CircleProgressBar_mainPaintColor, DEFAULT_PAINT_COLOR); // 获取画笔颜色 mBackgroundPicture = array .getDrawable(R.styleable.CircleProgressBar_src); mCircleAttribute.setTextPaintColor(textPaintColor); mCircleAttribute.setMainPaintColor(mainPaintColor); array.recycle(); // 一定要调用,否则会有问题 } /* * 默认参数 */ private void defaultParam() { mCircleAttribute = new CircleAttribute(); mCartoomEngine = new CartoomEngine(); mMaxProgress = DEFAULT_MAX_VALUE; mMainCurProgress = 0; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 设置视图大小 int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); if (mBackgroundPicture != null) { width = mBackgroundPicture.getMinimumWidth(); height = mBackgroundPicture.getMinimumHeight(); } int rwidth; int rheight; if (width < height) { rwidth = resolveSize(width, widthMeasureSpec); rheight = resolveSize(width, heightMeasureSpec); } else { rwidth = resolveSize(height, widthMeasureSpec); rheight = resolveSize(height, heightMeasureSpec); } setMeasuredDimension(rwidth, rheight); int paintWidth = (int) (1 * rwidth / 10.0); mCircleAttribute.setMainPaintWidth(paintWidth); if (mBackgroundPicture != null) { mBackgroundPicture.setBounds(paintWidth, paintWidth, rwidth - paintWidth, rheight - paintWidth); } setPadding(paintWidth, paintWidth, paintWidth, paintWidth); } protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mCircleAttribute.autoFix(w, h); } public void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBackgroundPicture == null) // 没背景图的话就绘制底色 { canvas.drawArc(mCircleAttribute.mBottomOval, 0, 360, true, mCircleAttribute.mBottomPaint); } else { mBackgroundPicture.draw(canvas); } float sweep = 360 * ((float) mMainCurProgress / mMaxProgress); canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, sweep, false, mCircleAttribute.mMainPaints); float left = (mCircleAttribute.mRoundOval.width()) / 2 + mCircleAttribute.mRoundOval.left + mCircleAttribute.mSidePaintInterval / 4; // 计算文字高度 float fontHeight = mCircleAttribute.fontMetrics.bottom - mCircleAttribute.fontMetrics.top; // 计算文字baseline float textBaseY = mCircleAttribute.mRoundOval.height() / 2 + fontHeight / 2 + mCircleAttribute.mSidePaintInterval / 4; canvas.drawText(mMainCurProgress + "%", left, textBaseY, mCircleAttribute.mTextPaint); } /* * 设置主进度值 */ public synchronized void setMainProgress(int progress) { mMainCurProgress = progress; if (mMainCurProgress <= 0) { mMainCurProgress = 0; } if (mMainCurProgress >= mMaxProgress) { mMainCurProgress = mMaxProgress; } invalidate(); } public synchronized int getMainProgress() { return mMainCurProgress; } /* * 开启动画 */ public void startCartoom(int percent) { mGoalProgress = percent; mCartoomEngine.startCartoom(); ScaleAnimation animation = new ScaleAnimation(0.9f, 1.1f, 0.9f, 1.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(300); this.startAnimation(animation); } /* * 结束动画 */ @SuppressWarnings("unused") private void stopCartoom() { mCartoomEngine.stopCartoom(); } public void setMainPaintColor(int color) { mCircleAttribute.setMainPaintColor(color); } public void setBottomPaintColor(int color) { mCircleAttribute.setBottomPaintColor(color); } class CircleAttribute { public RectF mRoundOval; // 圆形所在矩形区域 public RectF mBottomOval; public int mSidePaintInterval; // 圆形向里缩进的距离 public int mPaintWidth; // 圆形画笔宽度(填充模式下无视) public int mPaintColor; // 画笔颜色 (即主进度条画笔颜色,子进度条画笔颜色为其半透明值) public int mDrawPos; // 绘制圆形的起点(默认为-90度即12点钟方向) public Paint mMainPaints; // 主进度条画笔 public Paint mTextPaint; // 百分比画笔 public int mTextPaintSize;// 描画文字大小 public FontMetrics fontMetrics;// 文字的描画区间 public Paint mBottomPaint; // 无背景图时绘制所用画笔 public CircleAttribute() { mRoundOval = new RectF(); mBottomOval = new RectF(); mSidePaintInterval = DEFAULT_INSIDE_VALUE; mPaintWidth = 0; mPaintColor = DEFAULT_PAINT_COLOR; mDrawPos = -90; mMainPaints = new Paint(); mMainPaints.setAntiAlias(true); mMainPaints.setStyle(Paint.Style.STROKE); mMainPaints.setStrokeWidth(mPaintWidth); mMainPaints.setColor(mPaintColor); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setTextAlign(Paint.Align.CENTER); mTextPaint.setColor(Color.argb(240, 255, 255, 255)); mBottomPaint = new Paint(); mBottomPaint.setAntiAlias(true); mBottomPaint.setStyle(Paint.Style.FILL); mBottomPaint.setColor(mPaintColor); mBottomPaint.setStrokeWidth(mPaintWidth); mBottomPaint.setAlpha(100); } /* * 设置主画笔宽度 */ public void setMainPaintWidth(int width) { mMainPaints.setStrokeWidth(width); } /* * 设置主画笔颜色 */ public void setMainPaintColor(int color) { mMainPaints.setColor(color); } /* * 设置背景颜色 */ public void setBottomPaintColor(int color) { mBottomPaint.setColor(color); mBottomPaint.setAlpha(200); } /* * 设置主画笔颜色 */ public void setTextPaintColor(int color) { mTextPaint.setColor(color); } /* * 自动修正 */ public void autoFix(int w, int h) { if (mSidePaintInterval != 0) { mRoundOval.set(mPaintWidth / 2 + mSidePaintInterval, mPaintWidth / 2 + mSidePaintInterval, w - mPaintWidth / 2 - mSidePaintInterval, h - mPaintWidth / 2 - mSidePaintInterval); mBottomOval.set(3 * mPaintWidth / 2 + mSidePaintInterval, 3 * mPaintWidth / 2 + mSidePaintInterval, w - 3 * mPaintWidth / 2 - mSidePaintInterval, h - 3 * mPaintWidth / 2 - mSidePaintInterval); } else { int sl = getPaddingLeft(); int sr = getPaddingRight(); int st = getPaddingTop(); int sb = getPaddingBottom(); mRoundOval.set(sl + mPaintWidth / 2, st + mPaintWidth / 2, w - sr - mPaintWidth / 2, h - sb - mPaintWidth / 2); mBottomOval.set(sl + 3 * mPaintWidth / 2, st + 3 * mPaintWidth / 2, w - sr - 3 * mPaintWidth / 2, h - sb - 3 * mPaintWidth / 2); } // 画笔粗细为背景的1/3 mTextPaint.setTextSize(mRoundOval.width() / 3); fontMetrics = mTextPaint.getFontMetrics(); } } class CartoomEngine { public Handler mHandler; public boolean mBCartoom; // 是否正在作动画 public Timer mTimer; // 用于作动画的TIMER public MyTimerTask mTimerTask; // 动画任务 public int mSaveMax; // 在作动画时会临时改变MAX值,该变量用于保存值以便恢复 public int mTimerInterval; // 定时器触发间隔时间(ms) public float mCurFloatProcess; // 作动画时当前进度值 public CartoomEngine() { mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case TIMER_ID: { if (mBCartoom == false) { return; } if (mGoalProgress == 0) { return; } mCurFloatProcess += 1; setMainProgress((int) mCurFloatProcess); // 达到指定值时暂停转动 if (mCurFloatProcess >= mGoalProgress) { stopCartoom(); } } break; } } }; mBCartoom = false; mTimer = new Timer(); mTimerInterval = 6; mCurFloatProcess = 0; } public synchronized void startCartoom() { if (mBCartoom == true) { return; } mBCartoom = true; setMainProgress(0); mCurFloatProcess = 0; mTimerTask = new MyTimerTask(); mTimer.schedule(mTimerTask, mTimerInterval, mTimerInterval); } public synchronized void stopCartoom() { if (mBCartoom == false) { return; } mBCartoom = false; if (mTimerTask != null) { mTimerTask.cancel(); mTimerTask = null; } } private final static int TIMER_ID = 0x0010; class MyTimerTask extends TimerTask { @Override public void run() { Message msg = mHandler.obtainMessage(TIMER_ID); msg.sendToTarget(); } } } }