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;
12 * めもまのオブジェクト・ライン・ラベルを描画するメソッド群
13 * (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
18 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 * 1.0f;
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 float drawObjectNoRegion(Canvas canvas, RectF objectShape, Paint paint)
144 // 何も表示しないとわからないので、ラベルが無いときには枠を表示する
145 paint.setColor(Color.DKGRAY);
146 canvas.drawRect(objectShape, paint);
147 paint.setColor(Color.WHITE);
151 static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
154 Path path = new Path();
155 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
156 path.moveTo(objectShape.left + margin, objectShape.top);
157 path.lineTo(objectShape.left, objectShape.centerY());
158 path.lineTo(objectShape.left, objectShape.bottom);
159 path.lineTo(objectShape.right, objectShape.bottom);
160 path.lineTo(objectShape.right, objectShape.centerY());
161 path.lineTo(objectShape.right - margin, objectShape.top);
162 path.lineTo(objectShape.left + margin, objectShape.top);
163 canvas.drawPath(path, paint);
164 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
167 static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
170 Path path = new Path();
171 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
172 path.moveTo(objectShape.left, objectShape.top);
173 path.lineTo(objectShape.left, objectShape.centerY());
174 path.lineTo(objectShape.left + margin, objectShape.bottom);
175 path.lineTo(objectShape.right - margin, objectShape.bottom);
176 path.lineTo(objectShape.right, objectShape.centerY());
177 path.lineTo(objectShape.right, objectShape.top);
178 path.lineTo(objectShape.left, objectShape.top);
179 canvas.drawPath(path, paint);
180 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
183 static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
186 Path path = new Path();
187 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
188 path.moveTo(objectShape.left + margin, objectShape.top);
189 path.lineTo(objectShape.left, objectShape.centerY());
190 path.lineTo(objectShape.left + margin, objectShape.bottom);
191 path.lineTo(objectShape.right, objectShape.bottom);
192 path.lineTo(objectShape.right, objectShape.top);
193 path.lineTo(objectShape.left + margin, objectShape.top);
194 canvas.drawPath(path, paint);
195 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
198 static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
201 Path path = new Path();
202 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2;
203 path.moveTo(objectShape.left, objectShape.top);
204 path.lineTo(objectShape.left, objectShape.centerY() + margin);
205 path.lineTo(objectShape.centerX(), objectShape.bottom);
206 path.lineTo(objectShape.right, objectShape.centerY() + margin);
207 path.lineTo(objectShape.right, objectShape.top);
208 path.lineTo(objectShape.left, objectShape.top);
209 canvas.drawPath(path, paint);
210 return (- MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN);
213 static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
216 Path path = new Path();
217 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f;
218 path.moveTo(objectShape.centerX(), objectShape.top);
219 path.lineTo(objectShape.left, objectShape.centerY() - margin);
220 path.lineTo(objectShape.left, objectShape.bottom);
221 path.lineTo(objectShape.right, objectShape.bottom);
222 path.lineTo(objectShape.right, objectShape.centerY() - margin);
223 path.lineTo(objectShape.centerX(), objectShape.top);
224 canvas.drawPath(path, paint);
225 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
228 static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
231 Path path = new Path();
232 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 4.0f;
233 path.moveTo(objectShape.left, objectShape.top);
234 path.lineTo(objectShape.left, objectShape.bottom);
235 path.lineTo(objectShape.right - margin, objectShape.bottom);
236 path.lineTo(objectShape.right, objectShape.centerY());
237 path.lineTo(objectShape.right - margin, objectShape.top);
238 path.lineTo(objectShape.left, objectShape.top);
239 canvas.drawPath(path, paint);
240 return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
243 static public void drawLineStraight(Canvas canvas)
251 static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
257 direction = (checkValue < x1) ? -1.0f : 1.0f;
258 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 - margin), paint);
259 canvas.drawLine(x1, y1, (x1 + direction * margin), (y1 + margin), paint);
263 direction = (checkValue < y1) ? -1.0f : 1.0f;
264 canvas.drawLine(x1, y1, (x1 - margin), (y1 + direction * margin), paint);
265 canvas.drawLine(x1, y1, (x1 + margin), (y1 + direction * margin), paint);
272 static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
277 // 接続線の傾きが、どれくらいの角度で入っているか?
278 float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1)) * 180.0d / Math.PI);
280 // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
281 // (2本、1本づつ引いて、それを回転行列で回転させている)
284 Matrix matrix1 = new Matrix();
285 matrix1.setRotate((centerDegree + 30), x1, y1);
286 Matrix matrix2 = new Matrix();
287 matrix2.setRotate((centerDegree - 30), x1, y1);
289 // 線分を引いた後、回転行列で回転させる
290 Path pathLine1 = new Path();
291 pathLine1.moveTo(x1, y1);
292 pathLine1.lineTo(x1 + moveX, y1);
293 pathLine1.transform(matrix1);
294 canvas.drawPath(pathLine1, paint);
296 Path pathLine2 = new Path();
297 pathLine2.moveTo(x1, y1);
298 pathLine2.lineTo(x1 + moveX, y1);
299 pathLine2.transform(matrix2);
300 canvas.drawPath(pathLine2, paint);
307 public static void drawTextLabel(Canvas canvas, Paint paint, MeMoMaObjectHolder.PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
309 // タイトルの先頭部分を表示する場合...
310 String labelToShow = pos.label;
311 if (displayObjectInformation == 0)
313 float width = region.width() - MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN_WIDTH;
314 int textLen = paint.breakText(pos.label, true, width, null); // 省略文字を追加するから、そのぶん減らす
315 labelToShow = labelToShow.substring(0, textLen);
316 if (!labelToShow.equals(pos.label))
318 // truncate した場合には、省略文字を出す。
319 labelToShow = labelToShow + "...";
323 if (Paint.Style.valueOf(pos.paintStyle) != Paint.Style.STROKE)
325 // オブジェクトを塗りつぶすのときは、文字の色を設定する
326 paint.setColor(pos.labelColor);
330 paint.setStyle(Paint.Style.FILL_AND_STROKE);
331 paint.setShadowLayer(0.7f, 0.7f, 0.7f, Color.DKGRAY);
336 canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
340 if (pos.strokeWidth != 0.0f)
342 // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
343 paint.setStrokeWidth(0.0f);
344 paint.setSubpixelText(true);
345 paint.setUnderlineText (true);
348 if (displayObjectInformation == 0)
350 // 1行分しか表示しない場合...そのまま表示して終了する
351 canvas.drawText(labelToShow, (region.left + offsetX), (region.centerY() + offsetY), paint);
355 float tall = paint.getFontMetrics().top + 1.0f;
356 float posX = (region.left + offsetX);
357 float posY = (region.centerY() + offsetY);
358 float width = region.right - region.left - 12.0f; // 幅
361 int endChar = pos.label.length();
364 int textLen = paint.breakText(pos.label, startChar, endChar, true, width, null);
365 canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
368 startChar = startChar + textLen;
369 } while (startChar < endChar);