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>
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 ;
@Override
public 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) ;
}
@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 ;
}
}
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在创建的时候执行这个函数
@Override
public 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) ;
}
}