最近一直在做图表相关的开发,一些普通的图表使用achartengine都可以实现了,但是一些特殊的需求实现起来就比较麻烦了,比如类似小米手环的睡眠分布图
-
这种不定宽度,并且不是成对出现的图表数据用achartengine的柱状图在实现的时候会非常麻烦(也许是我没有找到很好的方法),因此自己实现了一个不固定宽度的图表库,效果图如下
部分代码如下:
protected void drawBar(Canvas canvas, float x, float y, float width, float height, Paint paint) { canvas.save(); paint.setStyle(Paint.Style.FILL); float left = x, right, top; tempX = (height - y) / 6; float bottom; ratioY = (width - left) / (float)srcData.length; Data data; int len = dataSet.size(); for (int i = 0; i < len; i++) { bottom = height - tempX; data = dataSet.get(i); paint.setColor(data.getColor()); right = left + ratioY * data.getY(); top = bottom - tempX * data.getX(); if (top > bottom) { bottom = top; top = bottom + tempX * data.getX(); } if (isEnableGap && i != (len - 1)) { right--; canvas.drawRect(left, top, right, bottom, paint); canvas.drawRect(right, bottom, right++, bottom, paint); } else { canvas.drawRect(left, top, right, bottom, paint); } left = right; } canvas.restore(); }
其中dataset存储需要显示的数据,这段代码的思想主要是通过将dataset中的相邻的Y轴相同的数据取出来,然后使用canvas.drawRect将这一部分的矩形画出来,其中涉及到设置矩形块的间隙,图表X轴的宽度计算,以及Y轴高度的计算,实现的功能比较简单,不过也算是满足使用要求了,并且在添加数据的时候非常方便