public class MarketCircleView extends View {
private Context mContext;
/**
* view宽度
*/
private int mWidth;
/**
* view高度
*/
private int mHeight;
private int mPaddingStart;
private int mPaddingEnd;
private int mPaddingTop;
private int mPaddingBottom;
// view开始X坐标点
private int mLeft;
// view开始y坐标点
private int mTop;
// view结束X坐标点
private int mRight;
// view结束y坐标点
private int mBottom;
/**
* 圆环的颜色
*/
private int roundColor;
/**
* 圆环里面字颜色
*/
private int circleTextColor;
/**
* 中间圆环名称的颜色
*/
private int cicleTextColor;
/**
* 中间圆环名称的大小
*/
private int cicleTextSize;
/**
* 右侧净买入
*/
private String netPurchaseText = "净买入";
/**
* 右侧余额
*/
private String balanceText = "余额";
/**
* 右侧净买入、余额字体大小
*/
private int tipTextSize;
/**
* 净买入:百分比显示的颜色
*/
private int roundProgressColor;
/**
* 画笔
*/
private Paint mPaint;
/**
* 圆环宽度
*/
private float roundWidth;
/**
* 数据源
*/
MarketItemModel marketCicleModel;
public MarketCircleView(Context context) {
super(context);
init();
}
public MarketCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
private void init() {
mPaint = new Paint();
mPaint.setStrokeWidth(0.5f);
mPaint.setAntiAlias(true);
cicleTextSize = StringUtils.dipToPx(12);
tipTextSize = StringUtils.dipToPx(11);
roundColor = 0xffcccccc;
if (CommonValue.styleType == CommonValue.StyleType.STYLE_WHITE) {
circleTextColor = 0xFF000000;
} else {
circleTextColor = 0xFFFFFFFF;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = getSizeFromMeasureSpec(widthMeasureSpec, 480);
mHeight = getSizeFromMeasureSpec(heightMeasureSpec, 480);
mPaddingStart = getPaddingLeft();
mPaddingEnd = getPaddingRight();
mPaddingTop = getPaddingTop();
mPaddingBottom = getPaddingBottom();
mLeft = mPaddingStart;
mTop = mPaddingTop;
mRight = mWidth - mPaddingEnd;
mBottom = mHeight - mPaddingBottom;
setMeasuredDimension(mWidth, mHeight);
}
// 绘制大圆环
private void drawCicle(Canvas canvas) {
// 设置圆环
int centerX = mLeft + (mRight - mLeft) / 4;// 获取圆心的x坐标,视图宽度的1\4作为圆心
int centerY = mTop + (mBottom - mTop) / 2;// 获取圆心的Y坐标
roundWidth = (mRight - mLeft) / 20;
int radius = (int) ((mRight - mLeft) / 4 - roundWidth); // 圆环的半径
if (centerY < radius) {
centerY = centerX;
}
mPaint.setColor(roundColor); // 设置圆环的颜色
mPaint.setStrokeWidth(roundWidth);
mPaint.setStyle(Paint.Style.STROKE); // 设置空心
canvas.drawCircle(centerX, centerY, radius, mPaint); // 画出圆环
mPaint.setStrokeWidth(0);
mPaint.setColor(circleTextColor);
mPaint.setTextSize(cicleTextSize);
float textWidth = mPaint.measureText("沪港通");
if (null != marketCicleModel) {
if (null != marketCicleModel.name && marketCicleModel.name.length() > 3) {
canvas.drawText(marketCicleModel.name.substring(0, 3), centerX - textWidth / 2, centerY
, mPaint); // 画出净买入占余额比例
float tempTextWidth = mPaint.measureText("(沪)");
canvas.drawText(marketCicleModel.name.substring(3, marketCicleModel.name.length()), centerX - tempTextWidth / 2, centerY
+ cicleTextSize, mPaint); // 画出净买入占余额比例
} else {
canvas.drawText(marketCicleModel.name, centerX - textWidth / 2, centerY
+ cicleTextSize / 2, mPaint); // 画出净买入占余额比例
}
}
// 设置比例是实心还是空心
mPaint.setStrokeWidth(roundWidth); // 设置圆环的宽度
if (null != marketCicleModel && marketCicleModel.directColor != 0) {
mPaint.setColor(marketCicleModel.directColor); // 设置比例的颜色
}
RectF oval = new RectF(centerX - radius, centerY - radius, centerX
+ radius, centerY + radius); // 用于定义的圆弧的形状和大小的界限
mPaint.setStyle(Paint.Style.STROKE);
if (null != marketCicleModel && marketCicleModel.captialDirect != 0 && marketCicleModel.captialLeft != 0) {
float rate = 360
* Math.abs(marketCicleModel.captialDirect)
/ (Math.abs(marketCicleModel.captialDirect) + Math
.abs(marketCicleModel.captialLeft));
canvas.drawArc(oval, 270, rate, false, mPaint); // 根据进度画圆弧
}
drawText(canvas, centerY, radius);
}
// 绘制右方数字
private void drawText(Canvas canvas, int centerY, int radius) {
try {
// “净买入”三个字
mPaint.setStrokeWidth(0);
mPaint.setColor(circleTextColor);
mPaint.setTextSize(tipTextSize);
float tipTextWidth = mPaint.measureText(netPurchaseText) / 3;
canvas.drawText(netPurchaseText, mWidth / 2 + tipTextWidth, centerY
- (radius - tipTextWidth/2), mPaint); // 画出净买入占余额比例
// “净买入”金额
mPaint.setColor(marketCicleModel.directColor);
mPaint.setTextSize(cicleTextSize);
String capitalDirect = "";
capitalDirect = CommonFunc.fixTText(marketCicleModel.captialDirect, 2);
canvas.drawText(capitalDirect + "", mWidth / 2
+ tipTextWidth, centerY - (radius - (2 * tipTextWidth)), mPaint); // 画出净买入占余额比例
// “余额”两个字
mPaint.setColor(circleTextColor);
mPaint.setTextSize(tipTextSize);
canvas.drawText(balanceText, mWidth / 2 + tipTextWidth, centerY
+ (radius - (3 * tipTextWidth / 2)), mPaint); // 画出净买入占余额比例
// “余额”金额
String captialLeft = "";
captialLeft = CommonFunc.fixTText(marketCicleModel.captialLeft, 2);
mPaint.setTextSize(cicleTextSize);
canvas.drawText(captialLeft + "", mWidth / 2
+ tipTextWidth, centerY + radius, mPaint); // 画出净买入占余额比例
} catch (Exception ex) {
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawCicle(canvas);
}
public int getRoundColor() {
return roundColor;
}
public void setRoundColor(int roundColor) {
this.roundColor = roundColor;
}
public int getCicleTextColor() {
return cicleTextColor;
}
public void setCicleTextColor(int cicleTextColor) {
this.cicleTextColor = cicleTextColor;
}
public int getRoundProgressColor() {
return roundProgressColor;
}
public void setRoundProgressColor(int roundProgressColor) {
this.roundProgressColor = roundProgressColor;
}
public MarketItemModel getMarketCicleModel() {
return marketCicleModel;
}
public void setMarketCicleModel(MarketItemModel marketCicleModel) {
this.marketCicleModel = marketCicleModel;
postInvalidate();
}
// 工具类
public static int getSizeFromMeasureSpec(int measureSpec, int defaultSize) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = defaultSize;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(defaultSize, size);
}
}
return result;
}
}
private Context mContext;
/**
* view宽度
*/
private int mWidth;
/**
* view高度
*/
private int mHeight;
private int mPaddingStart;
private int mPaddingEnd;
private int mPaddingTop;
private int mPaddingBottom;
// view开始X坐标点
private int mLeft;
// view开始y坐标点
private int mTop;
// view结束X坐标点
private int mRight;
// view结束y坐标点
private int mBottom;
/**
* 圆环的颜色
*/
private int roundColor;
/**
* 圆环里面字颜色
*/
private int circleTextColor;
/**
* 中间圆环名称的颜色
*/
private int cicleTextColor;
/**
* 中间圆环名称的大小
*/
private int cicleTextSize;
/**
* 右侧净买入
*/
private String netPurchaseText = "净买入";
/**
* 右侧余额
*/
private String balanceText = "余额";
/**
* 右侧净买入、余额字体大小
*/
private int tipTextSize;
/**
* 净买入:百分比显示的颜色
*/
private int roundProgressColor;
/**
* 画笔
*/
private Paint mPaint;
/**
* 圆环宽度
*/
private float roundWidth;
/**
* 数据源
*/
MarketItemModel marketCicleModel;
public MarketCircleView(Context context) {
super(context);
init();
}
public MarketCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
private void init() {
mPaint = new Paint();
mPaint.setStrokeWidth(0.5f);
mPaint.setAntiAlias(true);
cicleTextSize = StringUtils.dipToPx(12);
tipTextSize = StringUtils.dipToPx(11);
roundColor = 0xffcccccc;
if (CommonValue.styleType == CommonValue.StyleType.STYLE_WHITE) {
circleTextColor = 0xFF000000;
} else {
circleTextColor = 0xFFFFFFFF;
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mWidth = getSizeFromMeasureSpec(widthMeasureSpec, 480);
mHeight = getSizeFromMeasureSpec(heightMeasureSpec, 480);
mPaddingStart = getPaddingLeft();
mPaddingEnd = getPaddingRight();
mPaddingTop = getPaddingTop();
mPaddingBottom = getPaddingBottom();
mLeft = mPaddingStart;
mTop = mPaddingTop;
mRight = mWidth - mPaddingEnd;
mBottom = mHeight - mPaddingBottom;
setMeasuredDimension(mWidth, mHeight);
}
// 绘制大圆环
private void drawCicle(Canvas canvas) {
// 设置圆环
int centerX = mLeft + (mRight - mLeft) / 4;// 获取圆心的x坐标,视图宽度的1\4作为圆心
int centerY = mTop + (mBottom - mTop) / 2;// 获取圆心的Y坐标
roundWidth = (mRight - mLeft) / 20;
int radius = (int) ((mRight - mLeft) / 4 - roundWidth); // 圆环的半径
if (centerY < radius) {
centerY = centerX;
}
mPaint.setColor(roundColor); // 设置圆环的颜色
mPaint.setStrokeWidth(roundWidth);
mPaint.setStyle(Paint.Style.STROKE); // 设置空心
canvas.drawCircle(centerX, centerY, radius, mPaint); // 画出圆环
mPaint.setStrokeWidth(0);
mPaint.setColor(circleTextColor);
mPaint.setTextSize(cicleTextSize);
float textWidth = mPaint.measureText("沪港通");
if (null != marketCicleModel) {
if (null != marketCicleModel.name && marketCicleModel.name.length() > 3) {
canvas.drawText(marketCicleModel.name.substring(0, 3), centerX - textWidth / 2, centerY
, mPaint); // 画出净买入占余额比例
float tempTextWidth = mPaint.measureText("(沪)");
canvas.drawText(marketCicleModel.name.substring(3, marketCicleModel.name.length()), centerX - tempTextWidth / 2, centerY
+ cicleTextSize, mPaint); // 画出净买入占余额比例
} else {
canvas.drawText(marketCicleModel.name, centerX - textWidth / 2, centerY
+ cicleTextSize / 2, mPaint); // 画出净买入占余额比例
}
}
// 设置比例是实心还是空心
mPaint.setStrokeWidth(roundWidth); // 设置圆环的宽度
if (null != marketCicleModel && marketCicleModel.directColor != 0) {
mPaint.setColor(marketCicleModel.directColor); // 设置比例的颜色
}
RectF oval = new RectF(centerX - radius, centerY - radius, centerX
+ radius, centerY + radius); // 用于定义的圆弧的形状和大小的界限
mPaint.setStyle(Paint.Style.STROKE);
if (null != marketCicleModel && marketCicleModel.captialDirect != 0 && marketCicleModel.captialLeft != 0) {
float rate = 360
* Math.abs(marketCicleModel.captialDirect)
/ (Math.abs(marketCicleModel.captialDirect) + Math
.abs(marketCicleModel.captialLeft));
canvas.drawArc(oval, 270, rate, false, mPaint); // 根据进度画圆弧
}
drawText(canvas, centerY, radius);
}
// 绘制右方数字
private void drawText(Canvas canvas, int centerY, int radius) {
try {
// “净买入”三个字
mPaint.setStrokeWidth(0);
mPaint.setColor(circleTextColor);
mPaint.setTextSize(tipTextSize);
float tipTextWidth = mPaint.measureText(netPurchaseText) / 3;
canvas.drawText(netPurchaseText, mWidth / 2 + tipTextWidth, centerY
- (radius - tipTextWidth/2), mPaint); // 画出净买入占余额比例
// “净买入”金额
mPaint.setColor(marketCicleModel.directColor);
mPaint.setTextSize(cicleTextSize);
String capitalDirect = "";
capitalDirect = CommonFunc.fixTText(marketCicleModel.captialDirect, 2);
canvas.drawText(capitalDirect + "", mWidth / 2
+ tipTextWidth, centerY - (radius - (2 * tipTextWidth)), mPaint); // 画出净买入占余额比例
// “余额”两个字
mPaint.setColor(circleTextColor);
mPaint.setTextSize(tipTextSize);
canvas.drawText(balanceText, mWidth / 2 + tipTextWidth, centerY
+ (radius - (3 * tipTextWidth / 2)), mPaint); // 画出净买入占余额比例
// “余额”金额
String captialLeft = "";
captialLeft = CommonFunc.fixTText(marketCicleModel.captialLeft, 2);
mPaint.setTextSize(cicleTextSize);
canvas.drawText(captialLeft + "", mWidth / 2
+ tipTextWidth, centerY + radius, mPaint); // 画出净买入占余额比例
} catch (Exception ex) {
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawCicle(canvas);
}
public int getRoundColor() {
return roundColor;
}
public void setRoundColor(int roundColor) {
this.roundColor = roundColor;
}
public int getCicleTextColor() {
return cicleTextColor;
}
public void setCicleTextColor(int cicleTextColor) {
this.cicleTextColor = cicleTextColor;
}
public int getRoundProgressColor() {
return roundProgressColor;
}
public void setRoundProgressColor(int roundProgressColor) {
this.roundProgressColor = roundProgressColor;
}
public MarketItemModel getMarketCicleModel() {
return marketCicleModel;
}
public void setMarketCicleModel(MarketItemModel marketCicleModel) {
this.marketCicleModel = marketCicleModel;
postInvalidate();
}
// 工具类
public static int getSizeFromMeasureSpec(int measureSpec, int defaultSize) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = defaultSize;
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(defaultSize, size);
}
}
return result;
}
}