OSDN Git Service

パッケージの整理を開始。文字フォントを塗りつぶすように変更すうr。
[gokigen/MeMoMa.git] / app / src / main / java / jp / sourceforge / gokigen / memoma / drawers / ObjectShapeDrawer.java
1 package jp.sourceforge.gokigen.memoma.drawers;
2
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
10 import jp.sourceforge.gokigen.memoma.drawers.MeMoMaCanvasDrawer;
11 import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
12
13 /**
14  *   めもまのオブジェクト・ライン・ラベルを描画するメソッド群
15  *   (現在のところ、MeMoMaCanvasDrawerクラスから追い出してきただけ...)
16  * 
17  * @author MRSa
18  *
19  */
20 public class ObjectShapeDrawer
21 {
22
23
24     static public float drawObjectOval(Canvas canvas, RectF objectShape, Paint paint)
25     {
26         // 楕円形の描画
27         canvas.drawOval(objectShape, paint);
28
29         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2);
30     }
31
32     static public float drawObjectRect(Canvas canvas, RectF objectShape, Paint paint)
33     {
34                 // 四角形を描画する
35         canvas.drawRect(objectShape, paint);
36         return (0.0f);
37     }
38
39     static public float drawObjectRoundRect(Canvas canvas, RectF objectShape, Paint paint)
40     {
41                 // 丸角四角形の描画
42         canvas.drawRoundRect(objectShape, MeMoMaObjectHolder.ROUNDRECT_CORNER_RX, MeMoMaObjectHolder.ROUNDRECT_CORNER_RY, paint);
43
44         return (0.0f);
45     }
46
47     static public float drawObjectDiamond(Canvas canvas, RectF objectShape, Paint paint)
48     {
49                 // 菱形の描画
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);
58     }
59
60     static public float drawObjectKeyboard(Canvas canvas, RectF objectShape, Paint paint)
61     {
62                 // 台形(キーボード型)の描画
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);
71     }
72
73     static public float drawObjectParallelogram(Canvas canvas, RectF objectShape, Paint paint)
74     {
75                 // 平行四辺形の描画
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);
84     }
85
86     static public float drawObjectHexagonal(Canvas canvas, RectF objectShape, Paint paint)
87     {
88                 // 六角形の描画
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);
100     }
101
102     static public float drawObjectPaper(Canvas canvas, RectF objectShape, Paint paint)
103     {
104                 // 書類の形の描画
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);
114     }
115
116     static public float drawObjectDrum(Canvas canvas, RectF objectShape, Paint paint, Paint.Style paintStyle)
117     {
118                 float margin = MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 1.0f;
119                 // 円柱の描画
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)
127         {
128                 // 塗りつぶし用に線の領域を追加する
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);
132         }
133         canvas.drawPath(path, paint);
134         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
135     }
136
137     static public float drawObjectCircle(Canvas canvas, RectF objectShape, Paint paint)
138     {
139                 // 円を描画する
140         canvas.drawCircle(objectShape.centerX(), objectShape.centerY(), ((objectShape.right - objectShape.left)/ 2.0f), paint);
141         return (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN / 2.0f);
142     }
143
144     static public float drawObjectNoRegion(Canvas canvas, RectF objectShape, Paint paint)
145     {
146                 // 何も表示しないとわからないので、ラベルが無いときには枠を表示する
147         paint.setColor(Color.DKGRAY);
148         canvas.drawRect(objectShape, paint);
149         paint.setColor(Color.WHITE);
150         return (0.0f);
151     }
152
153     static public float drawObjectLoopStart(Canvas canvas, RectF objectShape, Paint paint)
154     {
155                 // ループ開始図形の描画
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);
167     }
168
169     static public float drawObjectLoopEnd(Canvas canvas, RectF objectShape, Paint paint)
170     {
171                 // ループ終了図形の描画
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);
183     }
184
185     static public float drawObjectLeftArrow(Canvas canvas, RectF objectShape, Paint paint)
186     {
187                 // 左側矢印図形の描画
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);
198     }
199
200     static public float drawObjectDownArrow(Canvas canvas, RectF objectShape, Paint paint)
201     {
202                 // 下側矢印図形の描画
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);
213     }
214
215     static public float drawObjectUpArrow(Canvas canvas, RectF objectShape, Paint paint)
216     {
217                 // 上側矢印図形の描画
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);
228     }
229
230     static public float drawObjectRightArrow(Canvas canvas, RectF objectShape, Paint paint)
231     {
232                 // 右側矢印図形の描画
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);
243     }
244
245     static public void drawLineStraight(Canvas canvas)
246     {
247         
248     }
249           /**
250            *    矢印を描画する処理 (ツリー表示時)
251            * 
252            * @param canvas
253            * @param paint
254            * @param x1
255            * @param y1
256            * @param checkValue
257            * @param isXaxis
258            */
259         static public void drawArrowTree(Canvas canvas, Paint paint, float x1, float y1, float checkValue, boolean isXaxis)
260     {
261                 float margin = 8.0f;
262                 float direction = 1.0f;
263                 if (isXaxis == true)
264         {
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);
268                 }
269                 else
270                 {
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);                 
274                 }
275     }
276           /**
277            *    矢印を描画する処理
278            * 
279            * @param canvas
280            * @param paint
281            * @param x1
282            * @param y1
283            * @param x2
284            * @param y2
285            */
286           static public void drawArrow(Canvas canvas, Paint paint, float x1, float y1, float x2, float y2)
287           {
288           // 矢印線の長さ
289                   float moveX = 14.0f;
290                   
291                   // 接続線の傾きが、どれくらいの角度で入っているか?
292                   float centerDegree = (float) (Math.atan2((y2 - y1) , (x2 - x1))  * 180.0d / Math.PI);
293
294                   // x1, y1 に x2, y2 方向から来た線に合わせた矢印を描画する
295                   // (2本、1本づつ引いて、それを回転行列で回転させている)
296
297                   // 回転行列の準備
298                   Matrix matrix1 = new Matrix();
299                   matrix1.setRotate((centerDegree + 30), x1, y1);
300               Matrix matrix2 = new Matrix();
301                   matrix2.setRotate((centerDegree - 30), x1, y1);
302
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);
309
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);
315     }
316
317           /**
318              *    オブジェクトのラベルを表示する
319              * 
320              * @param canvas
321              * @param paint
322              * @param pos
323              */
324             public static void drawTextLabel(Canvas canvas, Paint paint, MeMoMaObjectHolder.PositionObject pos, RectF region, int displayObjectInformation, float offsetX, float offsetY)
325             {
326                 // タイトルの先頭部分を表示する場合...
327                 String labelToShow = pos.label;
328                 if (displayObjectInformation == 0)
329                 {
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)
334                 {
335                         // truncate した場合には、省略文字を出す。
336                         labelToShow = labelToShow + "...";
337                 }
338                 }
339
340                 if (Paint.Style.valueOf(pos.paintStyle) != Paint.Style.STROKE)
341                 {
342                     // オブジェクトを塗りつぶすのときは、文字の色を設定する
343                     paint.setColor(pos.labelColor);
344                 }
345                 
346                 // 文字をちょっと影付きにする
347             paint.setStyle(Paint.Style.FILL_AND_STROKE);
348                 paint.setShadowLayer(0.5f, 0.5f, 0.5f, Color.DKGRAY);
349                 
350                 // ユーザチェックの描画
351                 if (pos.userChecked == true)
352                 {
353                         canvas.drawText("*", region.centerX(), region.top + (MeMoMaCanvasDrawer.OBJECTLABEL_MARGIN * 2.0f), paint);
354                }
355                 
356                 // 強調表示
357                 if (pos.strokeWidth != 0.0f)
358                 {
359                         // そのまま表示すると、読めないので、太さを調整し、アンダーラインを引くことにする
360                         paint.setStrokeWidth(0.0f);
361                     paint.setSubpixelText(true);
362                     paint.setUnderlineText (true);
363                 }
364
365                 if (displayObjectInformation == 0)
366                 {            
367                         // 1行分しか表示しない場合...そのまま表示して終了する
368                     canvas.drawText(labelToShow, (region.left + offsetX),   (region.centerY() + offsetY), paint);
369                     return;
370                 }
371                 
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;  // 幅
376
377                 int startChar  = 0;
378                 int endChar = pos.label.length();
379                 do
380                 {
381                     int textLen = paint.breakText(pos.label, startChar, endChar, true, width, null);
382                     canvas.drawText(labelToShow, startChar, (startChar +textLen), posX, posY, paint);
383
384                     posY = posY - tall;
385                     startChar = startChar + textLen;
386                 } while (startChar < endChar);  
387             }
388 }