先看效果图
接着是源码下载地址
本来是使用MPAndroidChartLib,但是有一个业务上的bug,后来就想着自己练练手自己写一个。
因为以前没有真正自定义过涉及到onDraw()的控件,所以目前来看,这个控件的可扩展性还是很差的,留作以后有时间再做吧,主要就是抽象出来一些操作来实现其他样式或者功能的操作。
水平有限,在此只是帮助一些初学者提供一些思路上的帮助吧
这个View没什么复杂的地方,就是比较麻烦,主要流程有:
1、先画出表格中X轴和Y轴和表格里的虚线;
2、计算Y轴的刻度
3、遍历传入的数据列表绘制各个点的位置到Path中,数据线和阴影区域的区别就是:线只需要画到最后一个点就行了,而阴影则需要添加两个点,形成闭合区域。
4、动画的实现。
5、手势操作。
View的具体实现步骤和方法:
自定义属性(如果需要)
定义一个同名的declare-styleable。
<declare-styleable name="CashChart">
<attr name="line_color" format="color"/>
<attr name="shadow_color" format="color"/>
<attr name="y_axis_rows" format="integer"/>
</declare-styleable>
获取自定义属性
public CashChart(Context context) {
this(context, null);
}
public CashChart(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CashChart(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CashChart);
mLineColor = ta.getColor(R.styleable.CashChart_line_color, LINE_COLOR_DEFAULT);
mShadowColor = ta.getColor(R.styleable.CashChart_shadow_color, SHADOW_COLOR_DEFAULT);
mLineWidth = ta.getDimension(R.styleable.CashChart_line_width, LINE_WIDTH_DEFAULT);
mYAxisRows = ta.getInteger(R.styleable.CashChart_y_axis_rows, CHART_Y_AXIS_ROWS_DEFAULT);
ta.recycle();
init();
}
接着在init()方法中,初始化各种UI值、Paint、动画,在这里我为每个操作都定义了一个的画笔。动画后面再说。
接着有一个setData(List< ChartBean > data)方法,在设置后,计算出来最大最小值和差值,
private Paint mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);//画线用的
private Paint mLineEffectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//画虚线用的
private Paint mChartScaleTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//表格刻度文本
private Paint mCurPointPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//选中的点
private Paint mBubbleTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//选中的点的文本Paint
private Paint mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//阴影区域的画笔
public void setData(List<ChartBean> data) {
if (data == null) return;
this.mDatas = data;
//找出数据列表中最大值和最小值,来确定表格Y轴上的数值
float[] values = new float[mDatas.size()];
for (int i = 0; i < mDatas.size(); i++) {
if (mDatas.get(i) == null) continue;
values[i] = mDatas.get(i).getValue();
}
// 这里使用了冒泡算法
float[] sortValues = bubbleSort(values);
mMin