安卓静态坐标及折线图实现

MYViewActivity代码如下

import android.annotation.SuppressLint;     
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.util.Log;
import android.view.View;

@SuppressLint("DrawAllocation")
public class MyView extends View {
	// 默认边距
	private int Margin = 40;
	// 原点坐标
	private int Xpoint;
	private int Ypoint;
	// X,Y轴的单位长度
	private int Xscale = 20;
	private int Yscale = 20;
	// X,Y轴上面的显示文字
	private String[] Xlabel = { "0", "1", "2", "3", "4", "5", "6", "7", "8" };
	private String[] Ylabel = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
			"9", "10" };
	// 标题文本
	private String Title;
	// 曲线数据
	private int[] Data = {1, 2, 4, 6, 4, 8, 1, 7, 9 };

	public MyView(Context context, String[] xlabel, String[] ylabel,
			String title, int[] data) {
		super(context);
		this.Xlabel = xlabel;
		this.Ylabel = ylabel;
		this.Title = title;
		this.Data = data;
	}

	public MyView(Context context) {
		super(context);
	}

	// 初始化数据值
	public void init() {
		Xpoint = this.Margin;
		Ypoint = this.getHeight() - this.Margin;
		Xscale = (this.getWidth() - 2 * this.Margin) / (this.Xlabel.length - 1);
		Yscale = (this.getHeight() - 2 * this.Margin)
				/ (this.Ylabel.length - 1);
	}

	public int getMargin() {
		return Margin;
	}

	public void setMargin(int margin) {
		Margin = margin;
	}

	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawColor(Color.BLACK);
		Paint p1 = new Paint();
		p1.setStyle(Paint.Style.STROKE);
		p1.setAntiAlias(true);
		p1.setColor(Color.WHITE);
		p1.setStrokeWidth(2);
		init();
		this.drawXLine(canvas, p1);
		this.drawYLine(canvas, p1);
		this.drawTable(canvas);
		this.drawData(canvas);
	}

	// 画表格
	private void drawTable(Canvas canvas) {
		Paint paint = new Paint();
		paint.setStyle(Paint.Style.STROKE);
		paint.setColor(Color.GRAY);
		Path path = new Path();
		PathEffect effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 1);
		paint.setPathEffect(effects);
		// 纵向线
		for (int i = 1; i * Xscale <= (this.getWidth() - this.Margin); i++) {
			int startX = Xpoint + i * Xscale;
			int startY = Ypoint;
			int stopY = Ypoint - (this.Ylabel.length - 1) * Yscale;
			path.moveTo(startX, startY);
			path.lineTo(startX, stopY);
			canvas.drawPath(path, paint);
		}
		// 横向线
		for (int i = 1; (Ypoint - i * Yscale) >= this.Margin; i++) {
			int startX = Xpoint;
			int startY = Ypoint - i * Yscale;
			int stopX = Xpoint + (this.Xlabel.length - 1) * Xscale;
			path.moveTo(startX, startY);
			path.lineTo(stopX, startY);
			paint.setColor(Color.DKGRAY);
			canvas.drawPath(path, paint);
			paint.setColor(Color.WHITE);
			paint.setTextSize(this.Margin / 2);
			canvas.drawText(this.Ylabel[i], this.Margin / 4, startY
					+ this.Margin / 4, paint);
		}
	}

	// 画横纵轴
	private void drawXLine(Canvas canvas, Paint p) {
		canvas.drawLine(Xpoint, Ypoint, this.Margin, this.Margin, p);
		canvas.drawLine(Xpoint, this.Margin, Xpoint - Xpoint / 3, this.Margin
				+ this.Margin / 3, p);
		canvas.drawLine(Xpoint, this.Margin, Xpoint + Xpoint / 3, this.Margin
				+ this.Margin / 3, p);
	}

	private void drawYLine(Canvas canvas, Paint p) {
		canvas.drawLine(Xpoint, Ypoint, this.getWidth() - this.Margin, Ypoint,
				p);
		canvas.drawLine(this.getWidth() - this.Margin, Ypoint, this.getWidth()
				- this.Margin - this.Margin / 3, Ypoint - this.Margin / 3, p);
		canvas.drawLine(this.getWidth() - this.Margin, Ypoint, this.getWidth()
				- this.Margin - this.Margin / 3, Ypoint + this.Margin / 3, p);
	}

	// 画数据
	private void drawData(Canvas canvas) {
		Paint p = new Paint();
		p.setAntiAlias(true);
		p.setColor(Color.WHITE);
		p.setTextSize(this.Margin / 2);
		// 纵向线
		for (int i = 1; i * Xscale <= (this.getWidth() - this.Margin); i++) {
			int startX = Xpoint + i * Xscale;
			canvas.drawText(this.Xlabel[i], startX - this.Margin / 4,
					this.getHeight() - this.Margin / 4, p);
			canvas.drawCircle(startX, calY(Data[i]), 4, p);
			canvas.drawLine(Xpoint+(i-1)*Xscale, calY(Data[i-1]), startX, calY(Data[i]), p);
		}
	}
	
	/**
	 * 
	 * @param y  
	 * @return
	 */
	private int calY(int y){ 
		int y0 = 0 ;
		int y1 = 0 ;
	//	Log.i("zzzz", "y:"+y);
		try{
			y0 = Integer.parseInt(Ylabel[0]);
	//		Log.i("zzzz", "y0"+y0);
			y1 = Integer.parseInt(Ylabel[1]);
	//		Log.i("zzzz","y1"+y1);
		}catch(Exception e){
	//		Log.i("zzzz", "string changed is err");
			return 0;
		}
		try{
	//		Log.i("zzzz", "返回数据"+(Ypoint-(y-y0)*Yscale/(y1-y0)) );
			return Ypoint-((y-y0)*Yscale/(y1-y0)) ;
		}catch(Exception e){
		//	Log.i("zzzz", "return is err");
			return 0;
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值