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;
10 import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer;
11 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
14 * めもまのオブジェクト・ライン・ラベルを描画するメソッド群
15 * (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
20 public class ObjectShapeDrawer
24 static public float drawObjectOval(Canvas canvas, RectF objectShape, Paint paint)
27 canvas.drawOval(objectShape, paint);
29 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
32 static public float drawObjectRect(Canvas canvas, RectF objectShape, Paint paint)
35 canvas.drawRect(objectShape, paint);
39 static public float drawObjectRoundRect(Canvas canvas, RectF objectShape, Paint paint)
42 canvas.drawRoundRect(objectShape, MeMoMaObjectHolder.ROUNDRECT_CORNER_RX, MeMoMaObjectHolder.ROUNDRECT_CORNER_RY, paint);
47 static public float drawObjectDiamond(Canvas canvas, RectF objectShape, Paint paint)
50 Path path = new Path();
51 path.moveTo(objectShape.centerX(), objectShape.top);
52 path.lineTo(objectShape.left, objectShape.centerY());
53 path.lineTo(objectShape.centerX(), objectShape.bottom);
54 path.lineTo(objectShape.right, objectShape.centerY());
55 path.lineTo(objectShape.centerX(), objectShape.top);
56 canvas.drawPath(path, paint);
57 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
60 static public float drawObjectKeyboard(Canvas canvas, RectF objectShape, Paint paint)
63 Path path = new Path();
64 path.moveTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
65 path.lineTo(objectShape.left, objectShape.bottom);
66 path.lineTo(objectShape.right, objectShape.bottom);
67 path.lineTo(objectShape.right, objectShape.top);
68 path.lineTo(objectShape.left, objectShape.centerY() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
69 canvas.drawPath(path, paint);
70 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
73 static public float drawObjectParallelogram(Canvas canvas, RectF objectShape, Paint paint)
76 Path path = new Path();
77 path.moveTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
78 path.lineTo(objectShape.left, objectShape.bottom);
79 path.lineTo(objectShape.right - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.bottom);
80 path.lineTo(objectShape.right, objectShape.top);
81 path.lineTo(objectShape.left + MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN, objectShape.top);
82 canvas.drawPath(path, paint);
83 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
86 static public float drawObjectHexagonal(Canvas canvas, RectF objectShape, Paint paint)
89 Path path = new Path();
90 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
91 path.moveTo(objectShape.left + margin, objectShape.top);
92 path.lineTo(objectShape.left, objectShape.centerY());
93 path.lineTo(objectShape.left + margin, objectShape.bottom);
94 path.lineTo(objectShape.right - margin, objectShape.bottom);
95 path.lineTo(objectShape.right, objectShape.centerY());
96 path.lineTo(objectShape.right - margin, objectShape.top);
97 path.lineTo(objectShape.left + margin, objectShape.top);
98 canvas.drawPath(path, paint);
99 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
102 static public float drawObjectPaper(Canvas canvas, RectF objectShape, Paint paint)
105 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 3.0f;
106 Path path = new Path();
107 path.moveTo(objectShape.left, objectShape.top);
108 path.lineTo(objectShape.left, objectShape.bottom - margin);
109 path.cubicTo((objectShape.left + objectShape.centerX()) / 2.0f , objectShape.bottom, (objectShape.right + objectShape.centerX()) / 2.0f, objectShape.bottom - margin, objectShape.right, objectShape.bottom - margin);
110 path.lineTo(objectShape.right, objectShape.top);
111 path.lineTo(objectShape.left, objectShape.top);
112 canvas.drawPath(path, paint);
113 return ( - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
116 static public float drawObjectDrum(Canvas canvas, RectF objectShape, Paint paint, Paint.Style paintStyle)
118 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 1.0f;
120 Path path = new Path();
121 path.moveTo(objectShape.left, objectShape.top);
122 path.arcTo(new RectF(objectShape.left, objectShape.top,objectShape.right, objectShape.top + margin), 180.0f, 359.999f, true);
123 path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
124 path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
125 path.lineTo(objectShape.right, objectShape.top + (margin / 2.0f));
126 if (paintStyle != Paint.Style.STROKE)
129 path.arcTo(new RectF(objectShape.left, objectShape.top, objectShape.right, objectShape.top + margin), 180.0f, 180.0f, true);
130 path.lineTo(objectShape.left, objectShape.bottom - (margin / 2.0f));
131 path.arcTo(new RectF(objectShape.left, objectShape.bottom - margin, objectShape.right, objectShape.bottom), 180.0f, -180.0f, true);
133 canvas.drawPath(path, paint);
134 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
137 static public float drawObjectCircle(Canvas canvas, RectF objectShape, Paint paint)
140 canvas.drawCircle(objectShape.centerX(), objectShape.centerY(), ((objectShape.right - objectShape.left)/ 2.0f), paint);
141 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
144 static public float drawObjectNoRegion(Canvas canvas, RectF objectShape, Paint paint)
146 // 何も表示しないとわからないので、ラベルが無いときには枠を表示する
147 paint.setColor(Color.DKGRAY);
148 canvas.drawRect(objectShape, paint);
149 paint.setColor(Color.WHITE);
153 static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
156 Path path = new Path();
157 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
158 path.moveTo(objectShape.left + margin, objectShape.top);
159 path.lineTo(objectShape.left, objectShape.centerY());
160 path.lineTo(objectShape.left, objectShape.bottom);
161 path.lineTo(objectShape.right, objectShape.bottom);
162 path.lineTo(objectShape.right, objectShape.centerY());
163 path.lineTo(objectShape.right - margin, objectShape.top);
164 path.lineTo(objectShape.left + margin, objectShape.top);
165 canvas.drawPath(path, paint);
166 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
169 static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
172 Path path = new Path();
173 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
174 path.moveTo(objectShape.left, objectShape.top);
175 path.lineTo(objectShape.left, objectShape.centerY());
176 path.lineTo(objectShape.left + margin, objectShape.bottom);
177 path.lineTo(objectShape.right - margin, objectShape.bottom);
178 path.lineTo(objectShape.right, objectShape.centerY());
179 path.lineTo(objectShape.right, objectShape.top);
180 path.lineTo(objectShape.left, objectShape.top);
181 canvas.drawPath(path, paint);
182 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
185 static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
188 Path path = new Path();
189 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
190 path.moveTo(objectShape.left + margin, objectShape.top);
191 path.lineTo(objectShape.left, objectShape.centerY());
192 path.lineTo(objectShape.left + margin, objectShape.bottom);
193 path.lineTo(objectShape.right, objectShape.bottom);
194 path.lineTo(objectShape.right, objectShape.top);
195 path.lineTo(objectShape.left + margin, objectShape.top);
196 canvas.drawPath(path, paint);
197 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
200 static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
203 Path path = new Path();
204 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
205 path.moveTo(objectShape.left, objectShape.top);
206 path.lineTo(objectShape.left, objectShape.centerY() + margin);
207 path.lineTo(objectShape.centerX(), objectShape.bottom);
208 path.lineTo(objectShape.right, objectShape.centerY() + margin);
209 path.lineTo(objectShape.right, objectShape.top);
210 path.lineTo(objectShape.left, objectShape.top);
211 canvas.drawPath(path, paint);
212 return (- MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
215 static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
218 Path path = new Path();
219 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f;
220 path.moveTo(objectShape.centerX(), objectShape.top);
221 path.lineTo(objectShape.left, objectShape.centerY() - margin);
222 path.lineTo(objectShape.left, objectShape.bottom);
223 path.lineTo(objectShape.right, objectShape.bottom);
224 path.lineTo(objectShape.right, objectShape.centerY() - margin);
225 path.lineTo(objectShape.centerX(), objectShape.top);
226 canvas.drawPath(path, paint);
227 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
230 static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
233 Path path = new Path();
234 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
235 path.moveTo(objectShape.left, objectShape.top);
236 path.lineTo(objectShape.left, objectShape.bottom);
237 path.lineTo(objectShape.right - margin, objectShape.bottom);
238 path.lineTo(objectShape.right, objectShape.centerY());
239 path.lineTo(objectShape.right - margin, objectShape.top);
240 path.lineTo(objectShape.left, objectShape.top);
241 canvas.drawPath(path, paint);
242 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
245 static public void drawLineStraight(Canvas canvas)
259 static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
262 float direction = 1.0f;
265 direction = (checkValue < x1) ? -1.0f : 1.0f;
266 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 - margin), paint);
267 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 + margin), paint);
271 direction = (checkValue < y1) ? -1.0f : 1.0f;
272 canvas.drawLine(x1, y1, (x1 - margin), (y1 + direction * margin), paint);
273 canvas.drawLine(x1, y1, (x1 + margin), (y1 + direction * margin), paint);
286 static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
291 // 接続線の傾きが、どれくらいの角度で入っているか?
292 float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1)) * 180.0d / Math.PI);
294 // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
295 // (2本、1本づつ引いて、それを回転行列で回転させている)
298 Matrix matrix1 = new Matrix();
299 matrix1.setRotate((centerDegree + 30), x1, y1);
300 Matrix matrix2 = new Matrix();
301 matrix2.setRotate((centerDegree - 30), x1, y1);
303 // 線分を引いた後、回転行列で回転させる
304 Path pathLine1 = new Path();
305 pathLine1.moveTo(x1, y1);
306 pathLine1.lineTo(x1 + moveX, y1);
307 pathLine1.transform(matrix1);
308 canvas.drawPath(pathLine1, paint);
310 Path pathLine2 = new Path();
311 pathLine2.moveTo(x1, y1);
312 pathLine2.lineTo(x1 + moveX, y1);
313 pathLine2.transform(matrix2);
314 canvas.drawPath(pathLine2, paint);
324 public static void drawTextLabel(Canvas canvas, Paint paint, MeMoMaObjectHolder.PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
326 // タイトルの先頭部分を表示する場合...
327 String labelToShow = pos.label;
328 if (displayObjectInformation == 0)
330 float width = region.width() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN_WIDTH;
331 int textLen = paint.breakText(pos.label, true, width, null); // 省略文字を追加するから、そのぶん減らす
332 labelToShow = labelToShow.substring(0, textLen);
333 if (labelToShow != pos.label)
335 // truncate した場合には、省略文字を出す。
336 labelToShow = labelToShow + "...";
340 if (Paint.Style.valueOf(pos.paintStyle) != Paint.Style.STROKE)
342 // オブジェクトを塗りつぶすのときは、文字の色を設定する
343 paint.setColor(pos.labelColor);
347 paint.setStyle(Paint.Style.FILL_AND_STROKE);
348 paint.setShadowLayer(0.5f, 0.5f, 0.5f, Color.DKGRAY);
351 if (pos.userChecked == true)
353 canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
357 if (pos.strokeWidth != 0.0f)
359 // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
360 paint.setStrokeWidth(0.0f);
361 paint.setSubpixelText(true);
362 paint.setUnderlineText (true);
365 if (displayObjectInformation == 0)
367 // 1行分しか表示しない場合...そのまま表示して終了する
368 canvas.drawText(labelToShow, (region.left + offsetX), (region.centerY() + offsetY), paint);
372 float tall = paint.getFontMetrics().top + 1.0f;
373 float posX = (region.left + offsetX);
374 float posY = (region.centerY() + offsetY);
375 float width = region.right - region.left - 12.0f; // 幅
378 int endChar = pos.label.length();
381 int textLen = paint.breakText(pos.label, startChar, endChar, true, width, null);
382 canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
385 startChar = startChar + textLen;
386 } while (startChar < endChar);