画一个折线统计图



最近公司有一个项目搞一个折线统计图来显示一下温度,通过看了一些网上的代码,自己总结出一下简单点的代码:闲话不多扯,直接上图效;


上代码:

package com.lianyun.linechardemo;

import java.util.Random;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;

public class LineChartView extends View {

	private Paint rectPaint;// 设置左侧为白色,显示数表
	private Paint hLinePaint;// 内部线
	private Paint xLinePaint;// x线
	private Paint titlePaint;// 绘制文本的画笔
	private Paint linePaint;// 画折线
	private Paint paint;// 画转折点的为圆点
	private Paint titlePaint1;// 绘制底部文本的画笔

	private String[] strTime;
	private String[] str;
	private int[] text;

	private int X, Y;

	public LineChartView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context, attrs);
	}

	public LineChartView(Context context) {
		super(context);
		init(context, null);
	}

	private void init(Context context, Object object) {
		strTime = new String[] { "6点", "7点", "8点", "9点", "10点", "11点", "12点",
				"13点", "14点" };
		str = new String[] { "40", "37.5", "35", "32.5", "30", "27.5", "25",
				"22.5", "20","0" };
		text=new int[10];
		
		//产生一个随机的数据,这里表示折线的转折点
		for (int i = 0; i < text.length; i++) {
			int x=(int)(Math.random()*9+2);
			text[i]=x;
		}
	}

	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		rectPaint = new Paint();
		hLinePaint = new Paint();
		titlePaint = new Paint();
		linePaint = new Paint();
		paint = new Paint();
		titlePaint1 = new Paint();
		xLinePaint = new Paint();
		rectPaint.setAntiAlias(true);
		hLinePaint.setAntiAlias(true);
		titlePaint.setAntiAlias(true);
		linePaint.setAntiAlias(true);
		paint.setAntiAlias(true);
		titlePaint1.setAntiAlias(true);
		xLinePaint.setAntiAlias(true);

		Rect bundle1 = new Rect();
		Rect bundle2 = new Rect();

		int perWidth = getWidth() / 10;
		int perHeigth = getHeight() / 11;

		// 设置左侧白框
		rectPaint.setColor(Color.WHITE);
		canvas.drawRect(0, 0, dp2px(30), getHeight() - perHeigth, rectPaint);

		hLinePaint.setColor(Color.RED);
		hLinePaint.setStrokeWidth(1);
		titlePaint.setTextSize(sp2px(15));
		// 画内部的线和Y轴的字
		for (int i = 0; i < 10; i++) {
			Y = perHeigth * (i + 1);
			canvas.drawLine(dp2px(30), Y, getWidth(), Y, hLinePaint);
			titlePaint.getTextBounds(str[i], 0, str[i].length(), bundle2);
			canvas.drawText(str[i], dp2px(30) - bundle2.width(),
					Y + (bundle2.height() / 2), titlePaint);
		}
		xLinePaint.setColor(Color.RED);
		xLinePaint.setStrokeWidth(1);
		// 横坐标字
		titlePaint1.setTextSize(sp2px(15));
		for (int i = 0; i < 10; i++) {
			X = perWidth * (i + 1);
			canvas.drawLine(X + dp2px(30), perHeigth * 10, X + dp2px(30),
					perHeigth * 10 - dp2px(5), xLinePaint);
		}
		for (int i = 0; i < 9; i++) {
			X = perWidth * (i + 1);
			titlePaint1.getTextBounds(strTime[i], 0, strTime[i].length(),
					bundle1);
			canvas.drawText(strTime[i], X - (bundle1.width() / 2) + dp2px(30),
					getHeight() - dp2px(25), titlePaint1);
		}

		// 画折线
		linePaint.setColor(Color.BLACK);
		linePaint.setStrokeWidth(3);
		for (int i = 0; i < 9; i++) {
			canvas.drawLine(dp2px(30) + perWidth * i, perHeigth * text[i],
					dp2px(30) + perWidth * (i + 1), perHeigth * text[i + 1],
					linePaint);
		}

		// 转折点画成圆
		paint.setColor(Color.RED);
		for (int i = 0; i < 10; i++) {
			canvas.drawCircle(dp2px(30) + perWidth * i, perHeigth * text[i],
					8.0f, paint);
		}

	}

	private int dp2px(int value) {
		float v = getContext().getResources().getDisplayMetrics().density;
		return (int) (v * value + 0.5f);
	}

	private int sp2px(int value) {
		float v = getContext().getResources().getDisplayMetrics().scaledDensity;
		return (int) (v * value + 0.5f);
	}

	
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值