package com.lfk.justwetools.View.CircleGraph;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import com.lfk.justwetools.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 环形统计图
*
* @author liufengkai
* Created by liufengkai on 15/11/6.
*/
public class CircleGraph extends View {
// 原点
private int mCircleXY;
// r
private float mRadius;
// 弧线外围的矩形
private RectF mArcRectF;
// 三个画笔
private Paint mCirclePaint;
private Paint mArcPaint;
private Paint mTextPaint;
private int mSweepValue = 100;
private int mStartValue = 0;
private int mCircleColor;
private int mArcColor;
private int ColorSet[] = {0xFFFEDD74, 0xFF82D8EF, 0xFFF76864, 0xFF80BD91, 0xFFFD9FC1, 0xFF};
private int mArcWidth = 40;
// 文字
private String text = null;
// 文字尺寸
private float textSize = 40;
private Context context;
private boolean jsonFlag = false;
private JSONArray Json = null;
public CircleGraph(Context context) {
super(context);
this.context = context;
initView();
}
public CircleGraph(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView();
}
private void initView() {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
int length = manager.getDefaultDisplay().getWidth();
mCircleXY = length / 2;
mRadius = (float) (length * 0.5) / 2;
mArcRectF = new RectF(
(float) (length * 0.1),
(float) (length * 0.1),
(float) (length * 0.9),
(float) (length * 0.9));
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(context.getResources().getColor(R.color.colorPrimaryDark));
mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mArcPaint.setColor(context.getResources().getColor(R.color.colorPrimary));
mArcPaint.setStyle(Paint.Style.STROKE);
mArcPaint.setAntiAlias(true);
mArcPaint.setDither(true);
mArcPaint.setStrokeWidth(mArcWidth);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(Color.WHITE);
mTextPaint.setTextSize(textSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 圆形
canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint);
// 弧线
// 弧线的外围矩形/ 起始角度 / 角度 / 是否封闭 / 画笔
if (jsonFlag && Json != null) {
int start = mStartValue;
for (int i = 0; i < Json.length(); i++) {
try {
JSONObject object = Json.getJSONObject(i);
if (object.has("color"))
mArcPaint.setColor(object.getInt("color"));
canvas.drawArc(mArcRectF, start, object.getInt("sweep"), false, mArcPaint);
start += object.getInt("sweep");
} catch (JSONException e) {
e.printStackTrace();
}
}
} else {
canvas.drawArc(mArcRectF, mStartValue, mSweepValue, false, mArcPaint);
}
// 文字
if (text != null) {
canvas.drawText(text, 0, text.length(),
mCircleXY - (text.length() * textSize / 2),
mCircleXY + (text.length() * textSize / 2),
mTextPaint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}
private int measureHeight(int heightMeasureSpec) {
int result = 500;
int specMode = MeasureSpec.getMode(heightMeasureSpec);
int specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.AT_MOST || specMode == MeasureSpec.EXACTLY) {
result = specSize;
}
return result;
}
private int measureWidth(int widthMeasureSpec) {
int result = 500;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.AT_MOST || specMode == MeasureSpec.EXACTLY) {
result = specSize;
}
return result;
}
/**
* 设定起始角度
*
* @param mStartValue
*/
public void setmStartValue(int mStartValue) {
this.mStartValue = mStartValue;
invalidate();
}
/**
* 设定百分比
*
* @param mSweepValue
*/
public void setmSweepValue(int mSweepValue) {
this.mSweepValue = mSweepValue;
invalidate();
}
/**
* 弧线颜色
*
* @param mArcColor
*/
public void setmArcColor(int mArcColor) {
this.mArcColor = mArcColor;
mArcPaint.setColor(mArcColor);
invalidate();
}
/**
* 圆形颜色
*
* @param mCircleColor
*/
public void setmCircleColor(int mCircleColor) {
this.mCircleColor = mCircleColor;
mCirclePaint.setColor(mCircleColor);
invalidate();
}
/**
* 设定文本
*
* @param text
*/
public void setText(String text) {
this.text = text;
}
/**
* 设定圆弧宽度
*
* @param mArcWidth
*/
public void setmArcWidth(int mArcWidth) {
this.mArcWidth = mArcWidth;
}
/**
* 设定文字尺寸
*
* @param textSize
*/
public void setTextSize(float textSize) {
this.textSize = textSize;
}
public void setJson(String json) {
try {
Json = new JSONArray(json);
jsonFlag = true;
} catch (JSONException e) {
e.printStackTrace();
jsonFlag = false;
}
}
}