OSDN Git Service

t25722
[train-delayed/source.git] / workspace / TrainDelayed / src / com / td / HistoryView.java
1 package com.td;\r
2 \r
3 import org.afree.chart.AFreeChart;\r
4 import org.afree.graphics.geom.RectShape;\r
5 \r
6 import android.content.Context;\r
7 import android.graphics.Canvas;\r
8 import android.util.AttributeSet;\r
9 import android.view.MotionEvent;\r
10 import android.view.View;\r
11 \r
12 public class HistoryView extends View {\r
13     private AFreeChart chart;\r
14         private int tx = -1;\r
15         private int ty = -1;\r
16         private int rr = -1;\r
17         private static float dw = 1;\r
18         private HistoryActivity activity;\r
19         \r
20     public HistoryView(Context context, AttributeSet attrs) {\r
21         super(context, attrs);\r
22     }\r
23 \r
24     public void setHistoryActivity(HistoryActivity activity){\r
25         this.activity = activity;\r
26     }\r
27     \r
28     @Override\r
29     protected void onDraw(Canvas canvas) {\r
30         super.onDraw(canvas);\r
31                 \r
32         int width = this.getWidth();\r
33                 int height = this.getHeight();\r
34                 RectShape chartArea = new RectShape(0.0, 0.0, width, height);\r
35                 this.chart.draw(canvas, chartArea);\r
36     }\r
37 \r
38     @Override\r
39     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\r
40         int width = (int)(HistoryActivity.W * dw);//measureWidth(widthMeasureSpec);\r
41                 int height = measureHeight(heightMeasureSpec);\r
42         setMeasuredDimension(width, height);\r
43 //      setMeasuredDimension(1000, 300);\r
44     }\r
45 \r
46     private int measureWidth(int measureSpec) {\r
47                 int result = 0;\r
48                 //int specMode = MeasureSpec.getMode(measureSpec);\r
49                 int specSize = MeasureSpec.getSize(measureSpec);\r
50 \r
51                 result = specSize;\r
52 \r
53                 return result;\r
54         }\r
55 \r
56         private int measureHeight(int measureSpec) {\r
57                 int result = 0;\r
58                 //int specMode = MeasureSpec.getMode(measureSpec);\r
59                 int specSize = MeasureSpec.getSize(measureSpec);\r
60 \r
61                 result = specSize;\r
62                 return result;\r
63         }\r
64         \r
65         public void setChart(AFreeChart chart) {\r
66         this.chart = chart;\r
67     }\r
68         \r
69         @Override\r
70         public boolean onTouchEvent(MotionEvent event) {\r
71                 if (chart == null){\r
72                         return true;\r
73                 }\r
74                 int type = event.getAction();\r
75                 int count = event.getPointerCount();\r
76                 \r
77                 switch (type){\r
78                 case MotionEvent.ACTION_DOWN:\r
79                         tx = -1;\r
80                         ty = -1;\r
81                         rr = -1;\r
82                         break;\r
83                 case MotionEvent.ACTION_MOVE:\r
84                         int history = event.getHistorySize() / count;\r
85                         \r
86                         for (int i = 0; i < history; i++){\r
87                                 int index1 = event.findPointerIndex(0);\r
88                                 int index2 = event.findPointerIndex(1);\r
89 \r
90                                 if (index1 >= 0 && index2 >= 0){\r
91                                         int ux1 = (int) event.getHistoricalX(index1, i);\r
92                                         int uy1 = (int) event.getHistoricalY(index1, i);\r
93                                         int ux2 = (int) event.getHistoricalX(index2, i);\r
94                                         int uy2 = (int) event.getHistoricalY(index2, i);\r
95                                         int ss = (ux1 - ux2) * (ux1 - ux2) + (uy1 - uy2) * (uy1 - uy2);\r
96                                         if (rr >= 0){\r
97                                                 float drr = rotateR(rr, ss);\r
98                                                 if (drr != 0){\r
99                                                         magnification(drr);                                             \r
100                                                 }\r
101                                         }\r
102                                         rr = ss;                                        \r
103                                 }\r
104                                 else if (index1 >= 0 || index2 >= 0){\r
105                                         int index;\r
106                                         if (index1 >= 0){\r
107                                                 index = index1;\r
108                                         }\r
109                                         else {\r
110                                                 index = index2;\r
111                                         }\r
112                                         \r
113                                         int ux = (int) event.getHistoricalX(index, i);\r
114                                         int uy = (int) event.getHistoricalY(index, i);\r
115 //                                      if (tx >= 0) {\r
116 //                                              float rx = rotateXY(tx, ux);\r
117 //                                              float ry = rotateXY(ty, uy);\r
118 //                                              if (rx != 0 || ry != 0) {\r
119 //                                                      drawer.rotate(rx, ry, 0);\r
120 //                                              }\r
121 //                                      }\r
122                                         tx = ux;\r
123                                         ty = uy;\r
124                                         rr = -1;\r
125                                 }\r
126                         }\r
127                         int index1 = event.findPointerIndex(0);\r
128                         int index2 = event.findPointerIndex(1);\r
129                         if (index1 >= 0 && index2 >= 0){\r
130                                 int ux1 = (int) event.getX(index1);\r
131                                 int uy1 = (int) event.getY(index1);\r
132                                 int ux2 = (int) event.getX(index2);\r
133                                 int uy2 = (int) event.getY(index2);\r
134                                 int ss = (ux1 - ux2) * (ux1 - ux2) + (uy1 - uy2) * (uy1 - uy2);\r
135                                 if (rr >= 0){\r
136                                         float drr = rotateR(rr, ss);\r
137                                         if (drr != 0){\r
138                                                 magnification(drr);                                             \r
139                                         }\r
140                                 }\r
141                                 rr = ss;\r
142                         }\r
143                         else if (index1 >= 0 || index2 >= 0){\r
144                                 int index;\r
145                                 if (index1 >= 0){\r
146                                         index = index1;\r
147                                 }\r
148                                 else {\r
149                                         index = index2;\r
150                                 }\r
151                                 \r
152                                 int ux = (int) event.getX(index);\r
153                                 int uy = (int) event.getY(index);\r
154 //                              if (tx >= 0) {\r
155 //                                      float rx = rotateXY(tx, ux);\r
156 //                                      float ry = rotateXY(ty, uy);\r
157 //                                      if (rx != 0 || ry != 0) {\r
158 //                                              drawer.rotate(rx, ry, 0);\r
159 //                                      }\r
160 //                              }\r
161                                 tx = ux;\r
162                                 ty = uy;\r
163                                 rr = -1;\r
164                         }\r
165                         break;\r
166                 }\r
167                 \r
168                 return true;\r
169         }\r
170 \r
171         private void magnification(float drr) {\r
172                 dw += drr;\r
173                 if (dw < 1){\r
174                         dw = 1;\r
175                 }\r
176                 else if (dw > 5){\r
177                         dw = 5;\r
178                 }\r
179         int width = (int)(HistoryActivity.W * dw);\r
180         this.setMinimumWidth(width);\r
181         activity.magnification(dw);\r
182                 this.requestLayout();\r
183         }\r
184 \r
185         private float rotateR(int src, int dst){\r
186                 if (src > dst){\r
187                         return -0.5f;\r
188                 }\r
189                 else if (src < dst){\r
190                         return 0.5f;                    \r
191                 }\r
192                 else {\r
193                         return 0.0f;\r
194                 }\r
195         }\r
196 }\r