1 package com.example.canvas.view;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Random;
6
7 import android.annotation.SuppressLint;
8 import android.content.Context;
9 import android.graphics.Canvas;
10 import android.graphics.Color;
11 import android.graphics.Paint;
12 import android.os.Handler;
13 import android.os.Message;
14 import android.util.AttributeSet;
15 import android.view.View;
16
17 @SuppressLint({ "DrawAllocation", "HandlerLeak" })
18 public class MyView extends View {
19 private int XPoint = 60;
20 private int YPoint = 260;
21 private int XScale = 8; // 刻度长度
22 private int YScale = 40;
23 private int XLength = 380;
24 private int YLength = 240;
25
26 private int MaxDataSize = XLength / XScale;
27
28 private List<Integer> data = new ArrayList<Integer>();
29
30 private String[] YLabel = new String[YLength / YScale];
31
32 private Handler handler = new Handler() {
33 public void handleMessage(Message msg) {
34 if (msg.what == 0x1234) {
35 MyView.this.invalidate();
36 }
37 };
38 };
39
40 public MyView(Context context, AttributeSet attrs) {
41 super(context, attrs);
42 // TODO Auto-generated constructor stub
43 for (int i = 0; i < YLabel.length; i++) {
44 YLabel[i] = (i + 1) + "M/s";
45 }
46
47 new Thread(new Runnable() {
48 @Override
49 public void run() {
50 while (true) {
51 try {
52 Thread.sleep(1000);
53 } catch (InterruptedException e) {
54 e.printStackTrace();
55 }
56 if (data.size() >= MaxDataSize) {
57 data.remove(0);
58 }
59 data.add(new Random().nextInt(4) + 1);
60 handler.sendEmptyMessage(0x1234);
61 }
62 }
63 }).start();
64
65 }
66
67 /*
68 * (non-Javadoc)
69 *
70 * @see android.view.View#onDraw(android.graphics.Canvas)
71 *
72 * if(data.size() > 1){ Path path = new Path(); path.moveTo(XPoint, YPoint -
73 * data.get(0) * YScale); for(int i=1; i<data.size(); i++){
74 * path.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale); }
75 * canvas.drawPath(path, paint); }
76 */
77 @Override
78 protected void onDraw(Canvas canvas) {
79 // TODO Auto-generated method stub
80 super.onDraw(canvas);
81
82 Paint paint = new Paint();
83 paint.setStyle(Paint.Style.STROKE);
84 paint.setAntiAlias(true); // 去锯齿
85 paint.setColor(Color.BLUE);
86
87 // 画Y轴
88 canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint);
89
90 // Y轴箭头
91 canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint - YLength
92 + 6, paint); // 箭头
93 canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint - YLength
94 + 6, paint);
95
96 // 添加刻度和文字
97 for (int i = 0; i * YScale < YLength; i++) {
98 canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i
99 * YScale, paint); // 刻度
100
101 canvas.drawText(YLabel[i], XPoint - 50, YPoint - i * YScale, paint);// 文字
102 }
103
104 // 画X轴
105 canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint);
106 System.out.println("Data.size = " + data.size());
107 if (data.size() > 1) {
108 for (int i = 1; i < data.size(); i++) {
109 canvas.drawLine(XPoint + (i - 1) * XScale,
110 YPoint - data.get(i - 1) * YScale, XPoint + i * XScale,
111 YPoint - data.get(i) * YScale, paint);
112 }
113 }
114
115 }
116
117 }