天天看點

android 曲線圖(自定義)

想看下曲線的使用方法,先上網搜尋了一下,按照步驟完成然後在本地無法運作起來,經過修改可以運作了。

先上效果圖:

android 曲線圖(自定義)

接着上代碼, 請往下看.

1.MainActivity.java

package com.chart.activity;

import com.chart.view.LineChartView;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	LineChartView lineChartView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		lineChartView = (LineChartView) findViewById(R.id.chart_line);

		String[] xLables = new String[] { "1月", "2月", "3月", "4月", "5月", "6月",
				"7月" };
		String[] yLabels = new String[] { "", "100", "200", "350", "400", "500" };
		String[] allData = new String[] { "50", "80", "220", "400", "190",
				"90", "98" };
		String title = "運動曲線圖 by吳宗坡 QQ:75896091";
		lineChartView.SetInfo(xLables, yLabels, allData, title);

	}
}
           

2.LineChartView.java

package com.chart.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class LineChartView extends View {
	public int XPoint = 40; // 原點的X坐标
	public int YPoint = 260; // 原點的Y坐标
	public int XScale = 55; // X的刻度長度
	public int YScale = 40; // Y的刻度長度
	public int XLength = 380; // X軸的長度
	public int YLength = 240; // Y軸的長度
	public String[] XLabel; // X的刻度
	public String[] YLabel; // Y的刻度
	public String[] Data; // 資料
	public String Title; // 顯示的标題

	public LineChartView(Context context) {
		super(context);
		initViewData();
	}
	
	public LineChartView(Context context,AttributeSet attributeSet) {
		super(context,attributeSet);
		initViewData();
	}
	
	private void initViewData(){
		String[] xLables = new String[] { "1月", "2月", "3月", "4月",
				"5月", "6月", "7月" };
		String[] yLabels = new String[] { "", "100", "200", "350", "400", "500" };
		String[] allData = new String[] { "50", "80", "220", "400", "190", "90",
				"98" };
		String title = "曲線圖  by QQ:75896091";
		SetInfo(xLables, yLabels, allData, title);
	}

	public void SetInfo(String[] XLabels, String[] YLabels, String[] AllData,
			String strTitle) {
		XLabel = XLabels;
		YLabel = YLabels;
		Data = AllData;
		Title = strTitle;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);// 重寫onDraw方法

		// canvas.drawColor(Color.WHITE);//設定背景顔色
		Paint paint = new Paint();
		paint.setStyle(Paint.Style.STROKE);
		paint.setAntiAlias(true);// 去鋸齒
		paint.setColor(Color.BLUE);// 顔色
		Paint paint1 = new Paint();
		paint1.setStyle(Paint.Style.STROKE);
		paint1.setAntiAlias(true);// 去鋸齒
		paint1.setColor(Color.DKGRAY);
		paint.setTextSize(12); // 設定軸文字大小
		// 設定Y軸
		canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint); // 軸線
		for (int i = 0; i * YScale < YLength; i++) {
			canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i
					* YScale, paint); // 刻度
			try {
				canvas.drawText(YLabel[i], XPoint - 22,
						YPoint - i * YScale + 5, paint); // 文字
			} catch (Exception e) {
			}
		}
		canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint - YLength
				+ 6, paint); // 箭頭
		canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint - YLength
				+ 6, paint);
		// 設定X軸
		canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint); // 軸線
		for (int i = 0; i * XScale < XLength; i++) {
			canvas.drawLine(XPoint + i * XScale, YPoint, XPoint + i * XScale,
					YPoint - 5, paint); // 刻度
			try {
				canvas.drawText(XLabel[i], XPoint + i * XScale - 10,
						YPoint + 20, paint); // 文字
				// 資料值
				if (i > 0 && YCoord(Data[i - 1]) != -999
						&& YCoord(Data[i]) != -999) // 保證有效資料
					canvas.drawLine(XPoint + (i - 1) * XScale,
							YCoord(Data[i - 1]), XPoint + i * XScale,
							YCoord(Data[i]), paint);
				canvas.drawCircle(XPoint + i * XScale, YCoord(Data[i]), 2,
						paint);
			} catch (Exception e) {
			}
		}
		canvas.drawLine(XPoint + XLength, YPoint, XPoint + XLength - 6,
				YPoint - 3, paint); // 箭頭
		canvas.drawLine(XPoint + XLength, YPoint, XPoint + XLength - 6,
				YPoint + 3, paint);
		paint.setTextSize(16);
		canvas.drawText(Title, 150, 50, paint);
	}

	private int YCoord(String y0) // 計算繪制時的Y坐标,無資料時傳回-999
	{
		int y;
		try {
			y = Integer.parseInt(y0);
		} catch (Exception e) {
			return -999; // 出錯則傳回-999
		}
		try {
			return YPoint - y * YScale / Integer.parseInt(YLabel[1]);
		} catch (Exception e) {
		}
		return y;
	}
	
}
           

3. mian.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <com.chart.view.LineChartView
        android:id="@+id/chart_line"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>
           

 DEMO源碼下載下傳位址:

http://download.csdn.net/detail/wuzongpo/9205121