android canvas绘制折线图和柱状图

来源:互联网 发布:遗传算法的基本步骤 编辑:程序博客网 时间:2024/05/01 15:43

layout/main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:paddingTop="20dip"><LinearLayout android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="60dip"><Button android:id="@+id/singleChart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="Single Chart" /><Button android:id="@+id/totalChart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="Total Chart" /></LinearLayout><LinearLayout android:id="@+id/chartArea"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="340dip" /><LinearLayout android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><TextView android:id="@+id/screenDesc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:textSize="18sp"android:visibility="invisible" /><TextView android:id="@+id/powerDesc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:textSize="18sp"android:visibility="invisible" /></LinearLayout></LinearLayout>


main.java

package cn.knight.barchart ;import android.app.Activity ;import android.graphics.Color ;import android.os.Bundle ;import android.view.KeyEvent ;import android.view.View ;import android.view.View.OnClickListener ;import android.view.Window ;import android.widget.Button ;import android.widget.LinearLayout ;import android.widget.TextView ;public class Main extends Activity implements 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 ;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState) ;requestWindowFeature(Window.FEATURE_NO_TITLE) ;setContentView(R.layout.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) ;}@Overridepublic 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) ;}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK)System.exit(0) ;return true ;}}


ChartView.java

package cn.knight.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) ;}//绘制坐标轴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++) {canvas.drawText(i + 1 + "", x, 320, paint) ;x += 60 ;}for (int i = 0; i < 5; i++) {canvas.drawText(50 * (i + 1) + "", 0, y, paint) ;y -= 50 ;}}//绘制图表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() ;}}}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) ;}//view在创建的时候执行这个函数@Overridepublic void onDraw(Canvas canvas) {canvas.drawColor(Color.BLACK) ;drawAxis(canvas) ;drawChart(canvas) ;}}

Char.java

package cn.knight.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 ;private int 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) ;}}