質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

806閲覧

drawrectを使用してタップした位置に四角形を描画したい

tokutoku453

総合スコア13

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/01/04 08:09

編集2019/01/05 11:33

androidstudioを使用してアプリを作成しています
drawrectを使用してタップした位置に四角形を描画したいのですがサイトや本をみてもよくわかりません
分かりやすい解説やサイトなどがあると教えていただけると助かります

1月5日20:30分追記

DrawingView

1import android.content.Context; 2import android.content.ReceiverCallNotAllowedException; 3import android.graphics.Canvas; 4import android.graphics.Color; 5import android.graphics.Paint; 6import android.graphics.Path; 7import android.graphics.Rect; 8import android.util.AttributeSet; 9import android.view.MotionEvent; 10import android.view.View; 11import java.util.ArrayList; 12import java.util.List; 13 14 15public class DrawingView extends View { 16 int touchX; //タッチした際のX 17 int touchY; //タッチした際のY 18 19 // 履歴 20 private List<DrawLine> lines; 21 // 現在、描いている線の情報 22 private Paint paint; 23 private Path path; 24 private Rect rect; 25 private Paint paint1; 26 27 // 線の履歴(座標+色) 28 class DrawLine { 29 private Paint paint; 30 private Path path; 31 private Rect rect; 32 private Paint paint1; 33 34 35 DrawLine(Path path, Paint paint, Rect rect) { 36 this.paint = new Paint(paint); 37 this.path = new Path(path); 38 this.rect = new Rect(rect); 39 //this.paint1 = new Paint(paint); 40 } 41 42 43 void draw(Canvas canvas) { 44 canvas.drawPath(this.path, this.paint); 45 } 46 } 47 48 public DrawingView(Context context) { 49 super(context); 50 } 51 52 53 54 public DrawingView(Context context, AttributeSet attrs) { 55 super(context, attrs); 56 57 this.path = new Path(); 58 59 this.paint = new Paint(); 60 61 this.rect = new Rect(); 62 63 64 65 this.paint.setStyle(Paint.Style.STROKE); 66 // this.paint.setStrokeJoin(Paint.Join.MITER);//これがあると角が丸くなる 67 this.paint.setStrokeCap(Paint.Cap.SQUARE); 68 this.paint.setAntiAlias(true); 69 this.paint.setStrokeWidth(30); 70 71 72 this.lines = new ArrayList<DrawLine>(); 73 74 75 } 76 77 @Override 78 protected void onDraw(Canvas canvas) { 79 super.onDraw(canvas); 80 81 82 // キャンバスをクリア 83 canvas.drawColor(Color.WHITE); 84 // 履歴から線を描画 85 for (DrawLine line : this.lines) { 86 line.draw(canvas); 87 } 88 // 現在、描いている線を描画 89 canvas.drawPath(this.path, this.paint); 90 91 Paint paint1 = new Paint(Color.WHITE); 92 paint1.setColor(Color.BLACK); 93 paint1.setStyle(Paint.Style.STROKE);//ペン先に合わせて色が一緒に代わってしまうので保留 94 95 for (int i = 0; i < 101; i++) { 96 for (int j = 0; j < 101; j++) { 97 int a = 30; 98 Rect rect = new Rect(a * i, a * j, a * (i + j) - 1, a * (i + j) - 1); 99 100 canvas.drawRect(rect, paint1); 101 102 } 103 } 104} 105 106 107 108 @Override 109 public boolean onTouchEvent(MotionEvent event) { 110 float x = event.getX(); 111 float y = event.getY(); 112 113 switch (event.getAction()) { 114 case MotionEvent.ACTION_DOWN: 115 this.path.moveTo(x, y); 116 this.path.lineTo(x, y); 117 break; 118 case MotionEvent.ACTION_MOVE: 119 this.path.lineTo(x, y); 120 break; 121 case MotionEvent.ACTION_UP: 122 this.path.lineTo(x, y); 123 // 指を離したので、履歴に追加する 124 this.lines.add(new DrawLine(this.path, this.paint, this.rect)); 125 // パスをリセットする 126 // これを忘れると、全ての線の色が変わってしまう 127 this.path.reset(); 128 break; 129 130 } 131 invalidate(); 132 return true; 133 } 134 135 public void delete() { 136 // 履歴をクリア 137 this.lines.clear(); 138 // 現在の線をクリア 139 this.path.reset(); 140 invalidate(); 141 } 142 143 public void setPen(int color){ 144 this.paint.setColor(color); 145 } 146 147 public void setStrokeWidth(float width){ 148 this.paint.setStrokeWidth(width); 149 150 } 151} 152

こちら該当箇所にコードを埋め込んで確認してみましたが、線を引く処理が優先されているのか、アプリケーションエラーでエミュレータが起動しなくなってしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この辺りが参考になると思います。
タップ時に Canvas に矩形を描画する単純なサンプル

onTouchEvent()の引数として渡されるeventを参照すれば、タップした場所を得ることができます。例えば、

java

1 case MotionEvent.ACTION_DOWN: 2 int x = (int) event.getX(); 3 int y = (int) event.getY(); 4 rect.set(x - 50, y - 50, x + 50, y + 50); 5 6 invalidate(); 7 break;

とすれば、タップした場所を中心とした四角形が描かれるでしょう。

投稿2019/01/04 14:31

keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokutoku453

2019/01/04 15:27

回答ありがとうございます 実装してみたのですがこちらはタッチした状態でスライドしたときの処理を追加する際はACTION_MOVEに同じように追加すればいいのでしょうか?
keicha_hrs

2019/01/05 03:47

お試しいただければいいかと・・・
tokutoku453

2019/01/05 10:55

こちらACTION_MOVEに実装したところ、エミュレーターが起動しなくなったので、おそらくループしてる可能性が出てきました。自宅に帰り次第、実装したコードを載せたいと思います。
keicha_hrs

2019/01/05 12:04

もう質問としては別内容になってしまうと思います。改めて質問を立てませんか?(当初の目的を果たしている(と思われる)質問に新たな内容を追加されてしまうと、きりがなくなるので・・・)
keicha_hrs

2019/01/05 12:10

また、新たに質問をされる際には、「動いていた段階のコード」と「何を追加したら動かなくなったのか」を分かるようにしていただければと思います。
tokutoku453

2019/01/05 12:41

わかりました、よくわかりにくくて申し訳ありません。
tokutoku453

2019/01/07 12:41

こちらに質問する形で申し訳ないです。 こちら参考サイトを元にタップすると矩形を大きくするという処理を実装しようとしているのですが、ACTION_DOWNに参考コードを入れるとアプリケーションエラーが起きてしまいます。 またこちら、タップではなくボタンをタッチで大きくなる処理などはできるのでしょうか…
keicha_hrs

2019/01/07 14:17

「すでに描画済みの四角の枠内をタップしたら、その四角を一回り大きくする」ということでしょうか?また、枠外をタップしたときにはどうするのでしょうか。その辺りの仕様を整理せずにプログラムしてしまうと、多分うまくいかないと思います。(何事も最初が肝心・・・)
tokutoku453

2019/01/07 23:33

たびたび申し訳ありません。 例えばなんですけれども ボタンで色を変える処理をしているですが それと同じような形でボタンをタップするとcanvas中央に指定した矩形が表示されるという処理を実装してみたいのですが
tokutoku453

2019/01/07 23:33

設定した矩形が表示って形です
keicha_hrs

2019/01/08 09:54

??? 全然わからない・・・。 この質問はすでにクローズされているのと、新たに作られた質問が進行中ですから、ここではお終いにしませんか。新たな質問の方も進展があったようですから、そちらもどこかで一区切り付けてクローズして、また新しい質問を立てて進展したソースをご提示された上で求めている動作を詳しく記されてはと思います(スクリーンショットを元にご説明いただいた方が良さそうというのもあるので)
keicha_hrs

2019/01/08 09:55

基本、当初の質問内容を達成できたら、同じ質問のコメント欄で追加質問をするのは止めた方がいいです。新しく質問を立てましょう。(面倒かもしれないけど)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問