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();
}
}
}
}