1 package jp.sourceforge.gokigen.memoma.drawers;
3 import android.graphics.Canvas;
4 import android.graphics.Color;
5 import android.graphics.Matrix;
6 import android.graphics.Paint;
7 import android.graphics.Path;
8 import android.graphics.RectF;
9 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
10 import jp.sourceforge.gokigen.memoma.holders.PositionObject;
13 * めもまのオブジェクト・ライン・ラベルを描画するメソッド群
14 * (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
19 public class ObjectShapeDrawer
22 static public float drawObjectOval(Canvas canvas, RectF objectShape, Paint paint)
25 canvas.drawOval(objectShape, paint);
27 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
30 static public float drawObjectRect(Canvas canvas, RectF objectShape, Paint paint)
33 canvas.drawRect(objectShape, paint);
37 static public float drawObjectRoundRect(Canvas canvas, RectF objectShape, Paint paint)
40 canvas.drawRoundRect(objectShape, MeMoMaObjectHolder.ROUNDRECT_CORNER_RX, MeMoMaObjectHolder.ROUNDRECT_CORNER_RY, paint);
45 static public float drawObjectDiamond(Canvas canvas, RectF objectShape, Paint paint)
48 Path path = new Path();
49 path.moveTo(objectShape.centerX(), objectShape.top);
50 path.lineTo(objectShape.left, objectShape.centerY());
51 path.lineTo(objectShape.centerX(), objectShape.bottom);
52 path.lineTo(objectShape.right, objectShape.centerY());
53 path.lineTo(objectShape.centerX(), objectShape.top);
54 canvas.drawPath(path, paint);
55 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
58 static public float drawObjectKeyboard(Canvas canvas, RectF objectShape, Paint paint)
61 Path path = new Path();
62 path.moveTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
63 path.lineTo(objectShape.left, objectShape.bottom);
64 path.lineTo(objectShape.right, objectShape.bottom);
65 path.lineTo(objectShape.right, objectShape.top);
66 path.lineTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
67 canvas.drawPath(path, paint);
68 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
71 static public float drawObjectParallelogram(Canvas canvas, RectF objectShape, Paint paint)
74 Path path = new Path();
75 path.moveTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
76 path.lineTo(objectShape.left, objectShape.bottom);
77 path.lineTo(objectShape.right - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.bottom);
78 path.lineTo(objectShape.right, objectShape.top);
79 path.lineTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
80 canvas.drawPath(path, paint);
81 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
84 static public float drawObjectHexagonal(Canvas canvas, RectF objectShape, Paint paint)
87 Path path = new Path();
88 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
89 path.moveTo(objectShape.left + margin, objectShape.top);
90 path.lineTo(objectShape.left, objectShape.centerY());
91 path.lineTo(objectShape.left + margin, objectShape.bottom);
92 path.lineTo(objectShape.right - margin, objectShape.bottom);
93 path.lineTo(objectShape.right, objectShape.centerY());
94 path.lineTo(objectShape.right - margin, objectShape.top);
95 path.lineTo(objectShape.left + margin, objectShape.top);
96 canvas.drawPath(path, paint);
97 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
100 static public float drawObjectPaper(Canvas canvas, RectF objectShape, Paint paint)
103 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 3.0f;
104 Path path = new Path();
105 path.moveTo(objectShape.left, objectShape.top);
106 path.lineTo(objectShape.left, objectShape.bottom - margin);
107 path.cubicTo((objectShape.left + objectShape.centerX()) / 2.0f , objectShape.bottom, (objectShape.right + objectShape.centerX()) / 2.0f, objectShape.bottom - margin, objectShape.right, objectShape.bottom - margin);
108 path.lineTo(objectShape.right, objectShape.top);
109 path.lineTo(objectShape.left, objectShape.top);
110 canvas.drawPath(path, paint);
111 return ( - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
114 static public float drawObjectDrum(Canvas canvas, RectF objectShape, Paint paint, Paint.Style paintStyle)
116 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN;
118 Path path = new Path();
119 path.moveTo(objectShape.left, objectShape.top);
120 path.arcTo(new RectF(objectShape.left, objectShape.top,objectShape.right, objectShape.top + margin), 180.0f, 359.999f, true);
121 path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
122 path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
123 path.lineTo(objectShape.right, objectShape.top + (margin / 2.0f));
124 if (paintStyle != Paint.Style.STROKE)
127 path.arcTo(new RectF(objectShape.left, objectShape.top, objectShape.right, objectShape.top + margin), 180.0f, 180.0f, true);
128 path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
129 path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
131 canvas.drawPath(path, paint);
132 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
135 static public float drawObjectCircle(Canvas canvas, RectF objectShape, Paint paint)
138 canvas.drawCircle(objectShape.centerX(), objectShape.centerY(), ((objectShape.right - objectShape.left)/ 2.0f), paint);
139 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
142 static public void drawObjectNoRegion(Canvas canvas, RectF objectShape, Paint paint)
144 // 何も表示しないとわからないので、ラベルが無いときには枠を表示する
145 paint.setColor(Color.DKGRAY);
146 canvas.drawRect(objectShape, paint);
147 paint.setColor(Color.WHITE);
150 static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
153 Path path = new Path();
154 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
155 path.moveTo(objectShape.left + margin, objectShape.top);
156 path.lineTo(objectShape.left, objectShape.centerY());
157 path.lineTo(objectShape.left, objectShape.bottom);
158 path.lineTo(objectShape.right, objectShape.bottom);
159 path.lineTo(objectShape.right, objectShape.centerY());
160 path.lineTo(objectShape.right - margin, objectShape.top);
161 path.lineTo(objectShape.left + margin, objectShape.top);
162 canvas.drawPath(path, paint);
163 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
166 static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
169 Path path = new Path();
170 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
171 path.moveTo(objectShape.left, objectShape.top);
172 path.lineTo(objectShape.left, objectShape.centerY());
173 path.lineTo(objectShape.left + margin, objectShape.bottom);
174 path.lineTo(objectShape.right - margin, objectShape.bottom);
175 path.lineTo(objectShape.right, objectShape.centerY());
176 path.lineTo(objectShape.right, objectShape.top);
177 path.lineTo(objectShape.left, objectShape.top);
178 canvas.drawPath(path, paint);
179 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
182 static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
185 Path path = new Path();
186 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
187 path.moveTo(objectShape.left + margin, objectShape.top);
188 path.lineTo(objectShape.left, objectShape.centerY());
189 path.lineTo(objectShape.left + margin, objectShape.bottom);
190 path.lineTo(objectShape.right, objectShape.bottom);
191 path.lineTo(objectShape.right, objectShape.top);
192 path.lineTo(objectShape.left + margin, objectShape.top);
193 canvas.drawPath(path, paint);
194 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
197 static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
200 Path path = new Path();
201 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
202 path.moveTo(objectShape.left, objectShape.top);
203 path.lineTo(objectShape.left, objectShape.centerY() + margin);
204 path.lineTo(objectShape.centerX(), objectShape.bottom);
205 path.lineTo(objectShape.right, objectShape.centerY() + margin);
206 path.lineTo(objectShape.right, objectShape.top);
207 path.lineTo(objectShape.left, objectShape.top);
208 canvas.drawPath(path, paint);
209 return (- MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
212 static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
215 Path path = new Path();
216 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f;
217 path.moveTo(objectShape.centerX(), objectShape.top);
218 path.lineTo(objectShape.left, objectShape.centerY() - margin);
219 path.lineTo(objectShape.left, objectShape.bottom);
220 path.lineTo(objectShape.right, objectShape.bottom);
221 path.lineTo(objectShape.right, objectShape.centerY() - margin);
222 path.lineTo(objectShape.centerX(), objectShape.top);
223 canvas.drawPath(path, paint);
224 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
227 static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
230 Path path = new Path();
231 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
232 path.moveTo(objectShape.left, objectShape.top);
233 path.lineTo(objectShape.left, objectShape.bottom);
234 path.lineTo(objectShape.right - margin, objectShape.bottom);
235 path.lineTo(objectShape.right, objectShape.centerY());
236 path.lineTo(objectShape.right - margin, objectShape.top);
237 path.lineTo(objectShape.left, objectShape.top);
238 canvas.drawPath(path, paint);
239 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
246 static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
252 direction = (checkValue < x1) ? -1.0f : 1.0f;
253 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 - margin), paint);
254 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 + margin), paint);
258 direction = (checkValue < y1) ? -1.0f : 1.0f;
259 canvas.drawLine(x1, y1, (x1 - margin), (y1 + direction * margin), paint);
260 canvas.drawLine(x1, y1, (x1 + margin), (y1 + direction * margin), paint);
267 static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
272 // 接続線の傾きが、どれくらいの角度で入っているか?
273 float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1)) * 180.0d / Math.PI);
275 // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
276 // (2本、1本づつ引いて、それを回転行列で回転させている)
279 Matrix matrix1 = new Matrix();
280 matrix1.setRotate((centerDegree + 30), x1, y1);
281 Matrix matrix2 = new Matrix();
282 matrix2.setRotate((centerDegree - 30), x1, y1);
284 // 線分を引いた後、回転行列で回転させる
285 Path pathLine1 = new Path();
286 pathLine1.moveTo(x1, y1);
287 pathLine1.lineTo(x1 + moveX, y1);
288 pathLine1.transform(matrix1);
289 canvas.drawPath(pathLine1, paint);
291 Path pathLine2 = new Path();
292 pathLine2.moveTo(x1, y1);
293 pathLine2.lineTo(x1 + moveX, y1);
294 pathLine2.transform(matrix2);
295 canvas.drawPath(pathLine2, paint);
302 public static void drawTextLabel(Canvas canvas, Paint paint, PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
304 // タイトルの先頭部分を表示する場合...
305 String labelToShow = pos.getLabel();
306 if (displayObjectInformation == 0)
308 float width = region.width() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN_WIDTH;
309 int textLen = paint.breakText(pos.getLabel(), true, width, null); // 省略文字を追加するから、そのぶん減らす
310 labelToShow = labelToShow.substring(0, textLen);
311 if (!labelToShow.equals(pos.getLabel()))
313 // truncate した場合には、省略文字を出す。
314 labelToShow = labelToShow + "...";
318 if (Paint.Style.valueOf(pos.getPaintStyle()) != Paint.Style.STROKE)
320 // オブジェクトを塗りつぶすのときは、文字の色を設定する
321 paint.setColor(pos.getLabelColor());
325 paint.setStyle(Paint.Style.FILL_AND_STROKE);
326 paint.setShadowLayer(0.7f, 0.7f, 0.7f, Color.DKGRAY);
329 if (pos.getUserChecked())
331 canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
335 if (pos.getstrokeWidth() != 0.0f)
337 // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
338 paint.setStrokeWidth(0.0f);
339 paint.setSubpixelText(true);
340 paint.setUnderlineText (true);
343 if (displayObjectInformation == 0)
345 // 1行分しか表示しない場合...そのまま表示して終了する
346 canvas.drawText(labelToShow, (region.left + offsetX), (region.centerY() + offsetY), paint);
350 float tall = paint.getFontMetrics().top + 1.0f;
351 float posX = (region.left + offsetX);
352 float posY = (region.centerY() + offsetY);
353 float width = region.right - region.left - 12.0f; // 幅
356 int endChar = pos.getLabel().length();
359 int textLen = paint.breakText(pos.getLabel(), startChar, endChar, true, width, null);
360 canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
363 startChar = startChar + textLen;
364 } while (startChar < endChar);