折线图报表
效果图:
1.新建ChartView extends View
package com.my.administrator.mychart;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import java.util.HashMap;
/**
* Created by Administrator on 2015/10/13.
*/
public class ChartView extends View {
private int width;
private int height;
private float maxValue;//传入数据的最大值
private int dataNum;//数据总数
private Paint mPaintBg;//报表背景画笔
private Paint mPaintCoveredBg;//用于画数据覆盖部分
private Paint mPaintChartLine;//用于画报表的网格
private Paint mPaintDataLine;//用于画数据连线
private Paint mPaintTextDate;//用于画日期文本
private Paint mPaintCircle;//用于画空心圆
private Paint mPaintFilledCircle;//用于画实心圆
private Paint mPaintTextValue;//用于画数据访问量值
private Path path;
private HashMap<Integer, LinearChartData<Float>> dataTotal;//用于得存储传入的总数据
//用一个setPaints()方法,设定所有画笔的属性,增加代码灵活性
public void setPaints(int bgColor, int coveredBgColor, int chartLineColor
, int dataLineColor, int textDateColor, int filledCircleColor, int circleColor, int textValueColor) {
mPaintBg.setColor(bgColor);
mPaintBg.setStyle(Paint.Style.FILL);
mPaintCoveredBg.setColor(coveredBgColor);
mPaintCoveredBg.setStyle(Paint.Style.FILL);
mPaintCircle.setColor(circleColor);
mPaintCircle.setStyle(Paint.Style.STROKE);
mPaintCircle.setStrokeWidth(5);
mPaintCircle.setAntiAlias(true);
mPaintFilledCircle.setColor(filledCircleColor);
mPaintFilledCircle.setStyle(Paint.Style.FILL);
mPaintFilledCircle.setAntiAlias(true);
mPaintChartLine.setColor(chartLineColor);
mPaintChartLine.setStyle(Paint.Style.STROKE);
mPaintChartLine.setAntiAlias(true);
mPaintDataLine.setColor(dataLineColor);
mPaintDataLine.setStyle(Paint.Style.STROKE);
mPaintDataLine.setStrokeWidth(SizeConvert.dip2px(getContext(), 4));
mPaintDataLine.setAntiAlias(true);
mPaintTextDate.setColor(textDateColor);
mPaintTextDate.setTextSize(SizeConvert.dip2px(getContext(), 10));
mPaintTextDate.setTextAlign(Paint.Align.CENTER);
mPaintTextDate.setAntiAlias(true);
mPaintTextValue.setColor(textValueColor);
mPaintTextValue.setTextSize(SizeConvert.dip2px(getContext(), 12));
mPaintTextValue.setTextAlign(Paint.Align.CENTER);
mPaintTextValue.setAntiAlias(true);
//重绘
invalidate();
}
//用于设定传入的总数据
public void setDataTotal(HashMap<Integer, LinearChartData<Float>> dataTotal) {
this.dataTotal = dataTotal;
invalidate();
}
public ChartView(Context context) {
super(context);
}
public ChartView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaintBg = new Paint();
mPaintCoveredBg = new Paint();
mPaintCircle = new Paint();
mPaintChartLine = new Paint();
mPaintDataLine = new Paint();
mPaintTextDate = new Paint();
mPaintTextValue = new Paint();
mPaintFilledCircle = new Paint();
path = new Path();
dataTotal = new HashMap<>();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//当总数据已经传入,即不为空时,根据总数据中数据个数设定view的总宽
if (dataTotal != null) {
width = (dataTotal.size() - 1) * xAddedNum + chartMarginHorizontal * 2;
getMaxValue(dataTotal);
}
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
/**
* 用于得到总数据中最大数据
*
* @param dataTotal 总数据
*/
private void getMaxValue(HashMap<Integer, LinearChartData<Float>> dataTotal) {
maxValue = 0f;
dataNum = 0;
for (int key : dataTotal.keySet()) {
if (dataTotal.get(key).getValue()>maxValue) {
maxValue = dataTotal.get(key).getValue();
}
dataNum++;
}
}
private int mChartHeight;//折线图的高
private int mChartWidth;//折线图的宽
private int startX = SizeConvert.dip2px(getContext(), 10);//开始绘制的x坐标
private int startY = SizeConvert.dip2px(getContext(), 5