最近研究了一下柱状图,自己写了一个Demo,示例效果图如下:
MainActivity.java
package com.sg7.barchart; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity implements View.OnClickListener { private static final int SINGLECHART = 1; private static final int TOTALCHART = 2; private LinearLayout layout_chart; private Button btn_single; private Button btn_total; private TextView txv_screen; private TextView txv_power; private ChartView chartView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); layout_chart = (LinearLayout) findViewById(R.id.chartArea); btn_single = (Button) findViewById(R.id.singleChart); btn_total = (Button) findViewById(R.id.totalChart); txv_screen = (TextView) findViewById(R.id.screenDesc); txv_power = (TextView) findViewById(R.id.powerDesc); btn_single.setOnClickListener(this); btn_total.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); int which = 0; if (id == R.id.singleChart) { which = SINGLECHART; txv_power.setVisibility(View.VISIBLE); txv_screen.setText("绿色: 显示器功耗"); txv_power.setText("蓝色: 电源功耗"); } else if (id == R.id.totalChart) { which = TOTALCHART; txv_power.setVisibility(View.INVISIBLE); txv_screen.setText("绿色: 总功耗"); } txv_screen.setVisibility(View.VISIBLE); txv_screen.setTextColor(Color.GREEN); txv_power.setTextColor(Color.BLUE); chartView = new ChartView(this, which); layout_chart.removeAllViews(); layout_chart.addView(chartView); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) System.exit(0); return true; } }
Chart.java
package com.sg7.barchart; import android.graphics.Canvas; import android.graphics.Paint; public class Chart { private final int w = 20;//柱形图宽度 private int h;//柱形图高度 private final int total_y = 300;//柱形图最底点的y轴坐标 private int x;//x轴的位置 public int getX() { return x; } public void setX(int x) { this.x = x; } public int getH() { return h; } public void setH(int h) { this.h = h; } public void drawSelf(Canvas canvas, Paint paint) { canvas.drawRect(x, total_y - h, w + x, total_y - 1, paint); } }
ChartView.java
package com.sg7.barchart; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class ChartView extends View { private int[] data_screen; private int[] data_power; private int[] data_total; private int flag; private int margin; private Chart chart; private Paint paint; public ChartView(Context context, int flag) { super(context); this.flag = flag; margin = 0; chart = new Chart(); data_screen = new int[]{90, 65, 80, 115}; data_power = new int[]{150, 125, 100, 130}; data_total = new int[4]; for (int i = 0; i < 4; i++) data_total[i] = data_screen[i] + data_power[i]; paint = new Paint(); paint.setAntiAlias(true); } @Override public void onDraw(Canvas canvas) { canvas.drawColor(Color.BLACK); drawAxis(canvas); drawChart(canvas); } /** * 画坐标轴 * * @param canvas */ public void drawAxis(Canvas canvas) { paint.setColor(Color.YELLOW); paint.setStrokeWidth(2); canvas.drawLine(30, 300, 310, 300, paint); canvas.drawLine(30, 20, 30, 300, paint); int x = 90; int y = 250; for (int i = 0; i < 4; i++) { //画x轴下面的数字,y轴固定,从90开始画,每次加60 canvas.drawText(i + 1 + "", x, 320, paint); x += 60; } for (int i = 0; i < 5; i++) { //画y轴左面的数字,x轴固定,从250开始画,每次加60 canvas.drawText(50 * (i + 1) + "", 0, y, paint); y -= 50; } } /** * 画柱形图 * * @param canvas */ public void drawChart(Canvas canvas) { if (flag == 1) { paint.setColor(Color.GREEN); int temp_screen = 30; for (int i = 0; i < 4; i++) { chart.setH(data_screen[i]); chart.setX(temp_screen + 20 * 2 + margin); chart.drawSelf(canvas, paint); margin = 20; temp_screen = chart.getX(); } margin = 0; paint.setColor(Color.BLUE); int temp_power = 50; for (int i = 0; i < 4; i++) { chart.setH(data_power[i]); chart.setX(temp_power + 20 * 2 + margin); chart.drawSelf(canvas, paint); margin = 20; temp_power = chart.getX(); } drawHighLines(canvas); } else if (flag == 2) { paint.setColor(Color.GREEN); int temp = 40; for (int i = 0; i < 4; i++) { chart.setH(data_total[i]); chart.setX(temp + 20 * 2 + margin); chart.drawSelf(canvas, paint); margin = 20; temp = chart.getX(); } } } /** * 画折线图 * * @param canvas */ public void drawHighLines(Canvas canvas) { int[][] highPoints = new int[4][2]; highPoints[0][0] = 90; highPoints[0][1] = data_total[0]; highPoints[1][0] = 150; highPoints[1][1] = data_total[1]; highPoints[2][0] = 210; highPoints[2][1] = data_total[2]; highPoints[3][0] = 270; highPoints[3][1] = data_total[3]; paint.setColor(Color.RED); for (int i = 0; i < 4; i++) { canvas.drawPoint(highPoints[i][0], 300 - highPoints[i][1], paint); canvas.drawText(data_total[i] + "", highPoints[i][0] - 10, 300 - highPoints[i][1] - 10, paint); } float[] pts = new float[16]; for (int i = 0; i < 12; i++) { pts[0] = 32; pts[1] = 300 - highPoints[0][1]; pts[2] = highPoints[0][0]; pts[3] = 300 - highPoints[0][1]; pts[4] = highPoints[0][0]; pts[5] = 300 - highPoints[0][1]; pts[6] = highPoints[1][0]; pts[7] = 300 - highPoints[1][1]; pts[8] = highPoints[1][0]; pts[9] = 300 - highPoints[1][1]; pts[10] = highPoints[2][0]; pts[11] = 300 - highPoints[2][1]; pts[12] = highPoints[2][0]; pts[13] = 300 - highPoints[2][1]; pts[14] = highPoints[3][0]; pts[15] = 300 - highPoints[3][1]; } canvas.drawLines(pts, paint); } }
项目中需要做柱状图的朋友们可以阅读参考一下,主要绘制步骤在ChartView.java这个类中,代码还算比较简单.
源码下载:http://download.csdn.net/detail/lingwu7/9374683