質問するログイン新規登録

質問編集履歴

4

助言をもとに書き直し

2019/01/07 11:51

投稿

tokutoku453
tokutoku453

スコア13

title CHANGED
File without changes
body CHANGED
@@ -2,11 +2,13 @@
2
2
  現在お絵描きの基本的な機能を実装しマス目を描画するところまでは実装 ![イメージ説明](552488adb9dedb4aa5b06ce2dfffa24a.png)
3
3
  今躓いているところはこちらの実装したマス目に沿ってドットを描画することです。
4
4
  今現在の実装している処理だとマス目に沿って描画できずマス目が関係ない状態になっています。
5
- ![イメージ説明](8b6cd980d3133ff91ca7ed42931ece37.png)
6
- こちらを一つのマス目に沿って点か線を描画できる処理を実装したいのですが他サイトや他質問を参考にしているのですが実装できていない状態です。
7
- また斜めに向かって描画する際もマス目に沿ってカクカク?な状態で描画できる方法を今模索中です
8
5
 
9
- 詳しい方のアドバイスを頂ければ嬉しいです。
6
+ 1月7日 20:47分追記
7
+ ![イメージ説明](0cf67e0191b389103a18627b9c9ab690.png)
8
+
9
+ アドバイスを元にコードを実装したところこのような結果になりました。思っていた通りにものすごく近づいたので嬉しいです!!
10
+ ACTION_MOVEを入れて、動かしているので下の4つの線のようにマス目からずれている描画になっています。1マスなら問題ない?のですが
11
+ 3*3だと少し見苦しいものになっているので少し修正したいと思います。やっぱり見苦しいのでACTION_MOVEを外して始点と終点をつなぐ形のほうが見やすかったりするのでしょうか?
10
12
  ```Drawingview
11
13
  import android.content.Context;
12
14
  import android.graphics.Canvas;
@@ -120,9 +122,15 @@
120
122
  public boolean onTouchEvent(MotionEvent event) {
121
123
 
122
124
 
123
- float x = event.getX();
125
+ float dx = event.getX();
124
- float y = event.getY();
126
+ float dy = event.getY();
125
127
 
128
+ int x = (int) (dx - dx % 30) +15;
129
+ int y = (int) (dy - dy % 30) +15;
130
+
131
+      
132
+
133
+
126
134
  switch (event.getAction()) {
127
135
  case MotionEvent.ACTION_DOWN:
128
136
  this.path.moveTo(x, y);

3

タグの追加

2019/01/07 11:51

投稿

tokutoku453
tokutoku453

スコア13

title CHANGED
File without changes
body CHANGED
File without changes

2

内容の変更

2019/01/06 18:39

投稿

tokutoku453
tokutoku453

スコア13

title CHANGED
@@ -1,1 +1,1 @@
1
- drawrectを応用しドット打てるようにしたい
1
+ android 開発 マス目に沿っ描画したい
body CHANGED
@@ -1,6 +1,167 @@
1
- drawrect用してドット打てるようにしたいと思っています。
1
+ androidStudio使用してお絵描きアプリっています。
2
- https://teratail.com/questions/44537
3
- こちら質問応用て矩形打てようにしよう思っているのすが、DrawLineなどが邪魔をしているのかアプリケションエラーでエミュレータが落ちてしまいます。
2
+ 現在お絵描き基本的な機能実装マス目描画するところまは実装 ![イメジ説明](552488adb9dedb4aa5b06ce2dfffa24a.png)
4
- 応用方法などはあるのょうか?
3
+ 今躓いていところはこちら実装たマス目に沿ってドットを描画することです。
4
+ 今現在の実装している処理だとマス目に沿って描画できずマス目が関係ない状態になっています。
5
+ ![イメージ説明](8b6cd980d3133ff91ca7ed42931ece37.png)
5
- また、マス目を指定しドット打てようにしたいのですがマス目沿っ矩形を描画す方法などはあるのでしょうか?
6
+ こちらを一つのマス目に沿っ点か線描画でき処理を実装したいのですが他サイトや他質問を参考るのですが実装できていない状態です。
7
+ また斜めに向かって描画する際もマス目に沿ってカクカク?な状態で描画できる方法を今模索中です
8
+
6
- 詳しい方アドバイスを頂ければ嬉しいです
9
+ 詳しい方アドバイスを頂ければ嬉しいです
10
+ ```Drawingview
11
+ import android.content.Context;
12
+ import android.graphics.Canvas;
13
+ import android.graphics.Color;
14
+ import android.graphics.Paint;
15
+ import android.graphics.Path;
16
+ import android.graphics.Rect;
17
+ import android.util.AttributeSet;
18
+ import android.view.MotionEvent;
19
+ import android.view.View;
20
+ import java.util.ArrayList;
21
+ import java.util.List;
22
+
23
+
24
+ public class DrawingView extends View {
25
+
26
+
27
+
28
+ // 履歴
29
+ private List<DrawLine> lines;
30
+ // 現在、描いている線の情報
31
+ private Paint paint;
32
+ private Path path;
33
+ private Rect rect;
34
+ private Paint paint1;
35
+
36
+ // 線の履歴(座標+色)
37
+ class DrawLine {
38
+ private Paint paint;
39
+ private Path path;
40
+ private Rect rect;
41
+ private Paint paint1;
42
+
43
+
44
+ DrawLine(Path path, Paint paint, Rect rect) {
45
+ this.paint = new Paint(paint);
46
+ this.path = new Path(path);
47
+ this.rect = new Rect(rect);
48
+ //this.paint1 = new Paint(paint);
49
+ }
50
+
51
+
52
+ void draw(Canvas canvas) {
53
+ canvas.drawPath(this.path, this.paint);
54
+ }
55
+ }
56
+
57
+ public DrawingView(Context context) {
58
+ super(context);
59
+ }
60
+
61
+
62
+
63
+ public DrawingView(Context context, AttributeSet attrs) {
64
+ super(context, attrs);
65
+
66
+ this.path = new Path();
67
+
68
+ this.paint = new Paint();
69
+
70
+ this.rect = new Rect();
71
+
72
+
73
+
74
+ this.paint.setStyle(Paint.Style.STROKE);
75
+ // this.paint.setStrokeJoin(Paint.Join.MITER);//これがあると角が丸くなる
76
+ this.paint.setStrokeCap(Paint.Cap.SQUARE);
77
+ this.paint.setAntiAlias(true);
78
+ this.paint.setStrokeWidth(30);
79
+
80
+
81
+ this.lines = new ArrayList<DrawLine>();
82
+
83
+
84
+ }
85
+
86
+ @Override
87
+ protected void onDraw(Canvas canvas) {
88
+ super.onDraw(canvas);
89
+
90
+
91
+ // キャンバスをクリア
92
+ canvas.drawColor(Color.WHITE);
93
+ // 履歴から線を描画
94
+ for (DrawLine line : this.lines) {
95
+ line.draw(canvas);
96
+ }
97
+ // 現在、描いている線を描画
98
+ canvas.drawPath(this.path, this.paint);
99
+
100
+ Paint paint1 = new Paint(Color.WHITE);
101
+ paint1.setColor(Color.BLACK);
102
+ paint1.setStyle(Paint.Style.STROKE);//ペン先に合わせて色が一緒に代わってしまうので保留
103
+
104
+ for (int i = 0; i < 101; i++) {
105
+ for (int j = 0; j < 101; j++) {
106
+ int a = 30;
107
+ Rect rect = new Rect(a * i, a * j, a * (i + j) - 1, a * (i + j) - 1);
108
+
109
+ canvas.drawRect(rect, paint1);
110
+
111
+
112
+
113
+ }
114
+ }
115
+ }
116
+
117
+
118
+
119
+ @Override
120
+ public boolean onTouchEvent(MotionEvent event) {
121
+
122
+
123
+ float x = event.getX();
124
+ float y = event.getY();
125
+
126
+ switch (event.getAction()) {
127
+ case MotionEvent.ACTION_DOWN:
128
+ this.path.moveTo(x, y);
129
+ this.path.lineTo(x, y);
130
+ break;
131
+ // case MotionEvent.ACTION_MOVE:
132
+ //this.path.lineTo(x, y);  ←こちらの処理を無効化して、始点と終点の間に線を引く処理を可能にし直線を引けるようにした
133
+ // break;
134
+
135
+ case MotionEvent.ACTION_UP:
136
+ this.path.lineTo(x, y);
137
+ // 指を離したので、履歴に追加する
138
+ this.lines.add(new DrawLine(this.path, this.paint, this.rect));
139
+ // パスをリセットする
140
+ // これを忘れると、全ての線の色が変わってしまう
141
+ this.path.reset();
142
+ break;
143
+
144
+ }
145
+ invalidate();
146
+ return true;
147
+ }
148
+
149
+ public void delete() {
150
+ // 履歴をクリア
151
+ this.lines.clear();
152
+ // 現在の線をクリア
153
+ this.path.reset();
154
+ invalidate();
155
+ }
156
+
157
+ public void setPen(int color){
158
+ this.paint.setColor(color);
159
+ }
160
+
161
+ public void setStrokeWidth(float width){
162
+ this.paint.setStrokeWidth(width);
163
+
164
+ }
165
+ }
166
+
167
+ ```

1

サイトのURLが間違っていたため

2019/01/06 07:22

投稿

tokutoku453
tokutoku453

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  drawrectを応用してドットを打てるようにしたいと思っています。
2
- https://teratail.com/questions/4453
2
+ https://teratail.com/questions/44537
3
3
  こちらの質問を応用して矩形を打てるようにしようと思っているのですが、DrawLineなどが邪魔をしているのかアプリケーションエラーでエミュレータが落ちてしまいます。
4
4
  応用方法などはあるのでしょうか?
5
5
  また、マス目を指定してドットを打てるようにしたいのですがマス目に沿って矩形を描画する方法などはあるのでしょうか?