自定义柱状图
来源:互联网 发布:qq群排名优化软件 编辑:程序博客网 时间:2024/06/08 05:07
自定义柱状图
在网上查了好多还是没有找到自己想要的。但是找到了一个比较相近的。初来乍到,第一次写博客。好紧张
先附上资料
这里写链接内容
我是根据他写的自己改造的,还请博主谅解。
先看效果
直接上代码吧:
public class CustomBarChartView extends View { private String COLOR = ""; private int hPerHeig; private int relativeHeight; public CustomBarChartView(Context context) { super(context); init(context, null); } public CustomBarChartView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } // 坐标轴 轴线 画笔: private Paint mlinePaint; // 坐标轴水平内部 虚线画笔 private Paint mlinePaintDott; // 绘制文本的画笔 private Paint titlePaint; // 矩形画笔 柱状图的样式信息 private Paint recPaint; /** * 初始化 * * @param context * @param attrs */ private void init(Context context, AttributeSet attrs) { mlinePaint = new Paint(); mlinePaintDott = new Paint(); titlePaint = new Paint(); recPaint = new Paint(); mlinePaint.setColor(Color.DKGRAY); mlinePaintDott.setColor(Color.LTGRAY); titlePaint.setColor(Color.BLACK); } //矩形数据 private int[] rectDate; //x轴数据 private String[] xTitles; //y轴数据 private String[] yTitlesStrings; //矩形蓝色的数据 private int[] rectBlueDate; /** * 更新矩形数据 * * @param thisData * @param color */ public void updateRectData(int[] thisData, String color) { rectDate = thisData; COLOR = color; this.postInvalidate(); } /** * 更新矩形数据 * * @param thisDataBlue */ public void updateBlueRectData(int[] thisDataBlue) { rectBlueDate = thisDataBlue; this.postInvalidate(); } /** * 更新x轴数据 * * @param xTitle */ public void updateXText(String[] xTitle) { xTitles = xTitle; this.postInvalidate(); } /** * 更新y轴数据 * * @param yTitlesString */ public void updateYText(String[] yTitlesString, int danwei) { yTitlesStrings = yTitlesString; relativeHeight = danwei; this.postInvalidate(); } /** * 重写onDraw()方法 * * @param canvas */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getMeasuredWidth(); // 1. 画线 canvas.drawLine(80, 5, 80, 320, mlinePaint); canvas.drawLine(80, 320, width - 10, 320, mlinePaint); // 2 绘制坐标内部的水平线 横向的 int leftHeight = 300; int hPerHeight = leftHeight / 10; mlinePaintDott.setTextAlign(Paint.Align.CENTER); mlinePaintDott.setTextSize(25); mlinePaintDott.setAntiAlias(true); for (int i = 0; i < 11; i++) { canvas.drawLine(80, leftHeight - (hPerHeight * i), width - 5, leftHeight - (hPerHeight * i), mlinePaintDott); } // 3,绘制坐标内部的水平线 竖直方向的的 for (int i = 0; i < 30; i++) { canvas.drawLine(80 + (i + 1) * 20, 0, 80 + (i + 1) * 20, 320, mlinePaintDott); } // 3 绘制 Y 轴方向的数据 if (yTitlesStrings != null && yTitlesStrings.length > 0) { Paint.FontMetrics metrics = titlePaint.getFontMetrics(); //相对高度 hPerHeig = leftHeight / (yTitlesStrings.length - 1); int descent = (int) metrics.descent; titlePaint.setTextAlign(Paint.Align.RIGHT); titlePaint.setTextSize(20); titlePaint.setAntiAlias(true); for (int i = 0; i < yTitlesStrings.length; i++) { canvas.drawText(yTitlesStrings[i], 70, 20 + i * hPerHeig + descent, titlePaint); } } int step = 0; // 4 绘制 X 轴方向数据 if (xTitles != null) { int xAxisLength = width - 110; int columCount = xTitles.length + 1; step = xAxisLength / columCount; for (int i = 0; i < columCount - 1; i++) { canvas.drawText(xTitles[i], 110 + step * (i + 1), 360, titlePaint); } } /**红色的*/ if (rectDate != null && rectDate.length > 0) { int thisCount = rectDate.length; for (int i = 0; i < thisCount; i++) { int value = rectDate[i]; int i1 = relativeHeight / hPerHeig; int i2 = value / i1; int top = leftHeight + 20 - i2; if (COLOR == "RED") { recPaint.setColor(Color.RED); }else { recPaint.setColor(Color.parseColor("#3299cc")); } Rect rect = new Rect(); rect.left = 100 + step * (i + 1) - 10; rect.right = 100 + step * (i + 1) + 10; L.i("top :" + top); rect.top = top; rect.bottom = 320; canvas.drawRect(rect, recPaint); } } /**蓝色的*/ if (rectBlueDate != null && rectBlueDate.length > 0) { int thisCount = rectBlueDate.length; for (int i = 0; i < thisCount; i++) { int value = rectBlueDate[i]; int i1 = relativeHeight / hPerHeig; int i2 = value / i1; int top = leftHeight + 20 - i2; recPaint.setColor(Color.parseColor("#3299cc")); Rect rect = new Rect(); rect.left = 100 + step * (i + 1) - 40; rect.right = 100 + step * (i + 1) - 20; rect.top = top; rect.bottom = 320; canvas.drawRect(rect, recPaint); } } } public void updateAllDate() { postInvalidate(); }}
因为我这个项目数据有些大,而且是可变的。所以X轴 和 Y轴的数据也是我代码计算好之后设置进来的。
如果你想要使用的话,可以直接在这个类里面写死X轴 和 Y轴的数据。也可以直接调用上面的四个update方法;
0 0
- 自定义柱状图
- 自定义柱状图
- 自定义控件-- 柱状图--Android
- WPF 自定义柱状图
- android自定义柱状图
- android自定义横向柱状图
- ios swfit 自定义柱状图
- 自定义view之柱状图
- 自定义圆头柱状图
- echarts自定义柱状图数字
- 自定义简单的柱状图
- 自定义View之柱状图
- iOS 自定义柱状图
- 自定义控件之柱状图
- 自定义view柱状图
- 自定义折线图/柱状图
- 自定义android控件,柱状图统计
- 安卓自定义图表----柱状图
- HDU 1087 Super Jumping! Jumping! Jumping!(最大上升子序列)
- 百度地图 点击地图规划路线
- 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块
- DAY20:leetcode #45 Jump Game II
- 自由与社会
- 自定义柱状图
- ubuntu报错permission
- ref与out的区别
- poj 1014 Dividing(多重背包/母函数)
- jmeter sampler中各个元件的执行顺序
- css布局之三列布局
- 一天一条Linux指令-uptime
- javascript代驾问题(this指向)
- Java虚拟机学习 - 体系结构 内存模型