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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

2回答

1676閲覧

android 開発 マス目に沿って点を描画したい

tokutoku453

総合スコア13

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

1グッド

0クリップ

投稿2019/01/06 04:48

編集2019/01/07 11:51

androidStudioを使用してお絵描きアプリを作っています。
現在お絵描きの基本的な機能を実装しマス目を描画するところまでは実装 イメージ説明
今躓いているところはこちらの実装したマス目に沿ってドットを描画することです。
今現在の実装している処理だとマス目に沿って描画できずマス目が関係ない状態になっています。

1月7日 20:47分追記
イメージ説明

アドバイスを元にコードを実装したところこのような結果になりました。思っていた通りにものすごく近づいたので嬉しいです!!
ACTION_MOVEを入れて、動かしているので下の4つの線のようにマス目からずれている描画になっています。1マスなら問題ない?のですが
3*3だと少し見苦しいものになっているので少し修正したいと思います。やっぱり見苦しいのでACTION_MOVEを外して始点と終点をつなぐ形のほうが見やすかったりするのでしょうか?

Drawingview

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

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

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

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

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

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

guest

回答2

0

ドット絵の描画を実現したいのであれば、方針を考え直したほうが良さそうです。
直線をマス目に近似することもできなくはないですが、いろいろと手間がかかります。

以下の方針で実装し直してみてください。

  1. マス目に対応するオブジェクトの配列を用意。それぞれにPaintとRectFを持たせる
  2. ViewのonSizeChangedで各マス目の矩形の位置を決定する
  3. onDrawではマス目の配列を元にcanvasに矩形と枠線を描画する
  4. onTouchEventではタッチ位置に対応するマスを配列から探し色を塗る(マス目のPaintに色を設定する)

※マス目の矩形と枠線は1回では描画できないので、Paintを別に用意するとよいです。

投稿2019/01/07 08:58

編集2019/01/07 09:05
kakajika

総合スコア3131

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

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

tokutoku453

2019/01/07 10:40

細かい回答と助言ありがとうございます。色々試してみたいと思います。
tokutoku453

2019/01/07 10:43

こちらはDrawingView上に実装したほうがいいのでしょうか?それとも別にjavaクラスを作って実装したほうがわかりやすいのでしょうか?
kakajika

2019/01/07 13:39

どちらでもいいと思いますよ。gistを見てもらうと分かると思いますが、直線を使ってどうのこうのするよりずっと簡単に実装できるはずです。
guest

0

ベストアンサー

線の枠内にきっちり収まる四角を描画したいということならば、タップした座標そのもので描画するのではなく、線の間隔で丸める必要がありますね。例えば、座標が31.234なら30、93.1386なら90といった具合に。これで求まるのは「タップ位置からの直近の線の交点」なので、これに「線の間隔の1/2」を加算したところに四角を描画すれば、きっちり収まるようになると思います。

java

1 float dx = event.getX(); 2 float dy = event.getY(); 3 4 int x = (int) (dx - dx % 30) + 15; 5 int y = (int) (dy - dy % 30) + 15;

こんなんでいけるんじゃないだろうか?

斜めに描くのは、DrawLineでは無理じゃないでしょうか。なぞりながら描画していくのであれば、座標を取得して上記の式で計算しながら、「その場所には四角を描画済みか?」調べて、未描画地点であれば四角を描く・・・みたいな感じ?

投稿2019/01/07 07:55

keicha_hrs

総合スコア6768

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

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

tokutoku453

2019/01/07 11:28

すみません 助言ありがとうございます 実装して実験してみたいと思います。
tokutoku453

2019/01/07 11:39

こちら実装してみたので 画像を差し替えてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問