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

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

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

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

Android Studio

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

Q&A

解決済

1回答

2474閲覧

canvas上にドットを打ち込めるようにしたいのですが

tokutoku453

総合スコア13

Android

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

Android Studio

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

0グッド

1クリップ

投稿2018/09/26 19:41

編集2018/09/27 10:13

今、androidstudioでドット絵を打てるアプリを開発してます。
canvas上に線を引く・消しゴムで消す・線の太さを変えるが実装されています。
しかし、線を引くことはできるのですが、ドット絵を打つアプリを開発しているんので線を引くではなく点で打つを実装したいです。
ですが、線の太さを変更したり、続けて描画するを変更しているのですがなぜかうまくいきません。
何かいい方法などはあるのでしょうか?
9/27 19:00追記
drawingviewのDrawLineの部分をDrawPointに変えて点を打てるようにしたいのですがやっぱり線で描画されてしまいます。
Pointに変換する以外で線を引くのではなくタッチ時点で点を打てるようにする方法はあるのでしょうか

drawingbiew.java

package e.toku.myapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; import java.util.List; public class DrawingView extends View { // 履歴 private List<DrawLine> lines; // 現在、描いている線の情報 private Paint paint; private Path path; // 線の履歴(座標+色) class DrawLine { private Paint paint; private Path path; DrawLine(Path path, Paint paint) { this.paint = new Paint(paint); this.path = new Path(path); } void draw(Canvas canvas) { canvas.drawPath(this.path, this.paint); } } public DrawingView(Context context) { super(context); } public DrawingView(Context context, AttributeSet attrs) { super(context, attrs); this.path = new Path(); this.paint = new Paint(); this.paint.setStyle(Paint.Style.STROKE); this.paint.setAntiAlias(true); //this.paint.setStrokeWidth(15); this.lines = new ArrayList<DrawLine>(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // キャンバスをクリア canvas.drawColor(Color.WHITE); // 履歴から線を描画 for(DrawLine line : this.lines) { line.draw(canvas); } // 現在、描いている線を描画 canvas.drawPath(this.path, this.paint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: this.path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: this.path.lineTo(x, y); break; case MotionEvent.ACTION_UP: this.path.lineTo(x, y); // 指を離したので、履歴に追加する this.lines.add(new DrawLine(this.path, this.paint)); // パスをリセットする // これを忘れると、全ての線の色が変わってしまう this.path.reset(); break; } invalidate(); return true; } public void delete() { // 履歴をクリア this.lines.clear(); // 現在の線をクリア this.path.reset(); invalidate(); } public void setPen(int color){ this.paint.setColor(color); } public void setStrokeWidth(float width){ this.paint.setStrokeWidth(width); } }

mainactivty

package e.toku.myapplication; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.CpuUsageInfo; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.Toast; import android.widget.SeekBar; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private DrawingView drawingView; Button red_button,blue_button,yellow_button,black_button,kesigomu_button; Button hutosa1_button,hutosa2_button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //線の色指定 blue_button= findViewById(R.id.blue_button); red_button= findViewById(R.id.red_button); yellow_button= findViewById(R.id.yellow_button) ; black_button= findViewById(R.id.black_button); kesigomu_button= findViewById(R.id.kesigomu_button); //線の太さ指定 hutosa1_button= findViewById(R.id.hutosa1_button); hutosa2_button= findViewById(R.id.hutosa2_button); blue_button.setOnClickListener(this); red_button.setOnClickListener(this); yellow_button.setOnClickListener(this); black_button.setOnClickListener(this); kesigomu_button.setOnClickListener(this); hutosa1_button.setOnClickListener(this); hutosa2_button.setOnClickListener(this); this.drawingView = findViewById(R.id.drawing_view); findViewById(R.id.deletebutton).setOnClickListener(deleteDrawing); } View.OnClickListener deleteDrawing = new View.OnClickListener(){ @Override public void onClick(View view){ drawingView.delete(); } }; public void onClick(View v){ switch(v.getId()){ //線の色指定 case R.id.blue_button: drawingView.setPen(Color.BLUE); Toast.makeText(this,"blue",Toast.LENGTH_SHORT).show(); break; case R.id.red_button: drawingView.setPen(Color.RED); Toast.makeText(this,"red",Toast.LENGTH_SHORT).show(); break; case R.id.yellow_button: drawingView.setPen(Color.YELLOW); Toast.makeText(this,"yellow",Toast.LENGTH_SHORT).show(); break; case R.id.black_button: drawingView.setPen(Color.BLACK); Toast.makeText(this,"black",Toast.LENGTH_SHORT).show(); break; case R.id.kesigomu_button: drawingView.setPen(Color.WHITE); drawingView.setStrokeWidth(45); Toast.makeText(this,"消しゴム",Toast.LENGTH_SHORT).show(); break; //線の太さ指定 case R.id.hutosa1_button: drawingView.setStrokeWidth(15); Toast.makeText(this,"太さ中",Toast.LENGTH_SHORT).show(); break; case R.id.hutosa2_button: drawingView.setStrokeWidth(30); Toast.makeText(this,"太さ大",Toast.LENGTH_SHORT).show(); break; } } @Override public void onPointerCaptureChanged(boolean hasCapture) { } }

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

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

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

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

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

m.ts10806

2018/09/26 21:01

現在はどのようなコードで実現されているのでしょうか?「うまくいかない」だけだとどのようなコードで何が起きているのかわからないのでそのあたりわかる内容を質問本文に追記してください
m.ts10806

2018/09/26 21:04

canvasはhtml5のもので、そのcanvasの操作じたいは自体はJavaScriptなどのはずなので、タグも適宜追加してください。内容次第ですがAndroid特有とは限りませんので
tokutoku453

2018/09/26 21:10

失礼いたしました 修正して再び投稿させていただきます
m.ts10806

2018/09/26 23:17

修正ありがとうございます。私みたいにタグで引っ張られる人もいるので…適切なタグ付けって慣れないと難しそうですね
guest

回答1

0

ベストアンサー

Paintの Cap を指定することで、Pathの始点・終点のまわりにどう描画を行うかを設定できます。デフォルトではCap.BUTTが指定されていてPathが1点のみだと描画がされないので、 Cap.SQUARECap.ROUND を指定してみてください。

  • Capのイメージ

Cap
(この画像は Xamarinのドキュメント からお借りしました)

追記についての補足

ACTION_DOWNの時点で点を描画したいのなら、上記の設定に加えて

java

1case MotionEvent.ACTION_DOWN: 2 this.path.moveTo(x, y); 3 this.path.lineTo(x, y); // 同じ位置への線を追加することで、点を描画する 4 break;

という風に修正してみてください。

投稿2018/09/27 04:18

編集2018/09/27 14:00
kakajika

総合スコア3131

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

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

tokutoku453

2018/11/08 21:31

やはり色々試してみたのですが描画した線を点にすることができませんでした。capの設定の仕方がおかしいということになるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問