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