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

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

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

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

Android

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

Android Studio

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

Q&A

1回答

839閲覧

Android Studioで簡単なお絵描きアプリを作るときの、色の変更についてのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2019/07/07 14:58

前提・実現したいこと

Android Studioで簡単なお絵描きアプリを制作しようとしています。
上のSpinnerで色を選択し、それに応じてペンの色を変えるようにしたいと思っています。

発生している問題・エラーメッセージ

はじめ、Pathのみに対してArrayListを作成したところ、新しい色を選んだと同時にこれまで書いていた線もその色で上書きされてしまうことがわかりました。
そのため、線ごとにPathとPaint情報をDrawInfoでひとまとめにして、そのArrayList(DrawList)を作成したつもりなのですが、実行すると仮想マシンが固まってしまいます。(エラーがどこに表示されるかもわからないので、それもお教えいただけると幸いです)

ソースコードのどの部分が間違っているかをお教えください。

該当のソースコード

Java

1package com.example.forpaintreminder; 2 3import android.content.Context; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.graphics.Paint; 7import android.graphics.Path; 8import android.util.AttributeSet; 9import android.view.MotionEvent; 10import android.view.View; 11 12import java.util.ArrayList; 13 14public class PaintView2 extends View { 15 16 //画面に線を引くためのなんか 17 private Paint paint; 18 19 private ArrayList<DrawInfo> drawList; 20 private Path path; 21 private DrawInfo info; 22 23 24 public PaintView2(Context context, AttributeSet attrs) { 25 super(context, attrs); 26 27 //線ごとにpaintとpath情報をもつArrayList 28 drawList = new ArrayList<DrawInfo>(); 29 30 //Paint関連 31 paint = new Paint(); 32 paint.setStyle(Paint.Style.STROKE); 33 //paint.setStrokeJoin(Paint.Join.ROUND); 34 //paint.setStrokeCap(Paint.Cap.ROUND); 35 paint.setColor(Color.BLACK); 36 paint.setAntiAlias(true); //アンチエイリアス 37 paint.setStrokeWidth(10); //線の太さ 38 } 39 40 //画面を描画するメソッド 41 @Override 42 protected void onDraw(Canvas canvas){ 43 for(int i = 0;i<drawList.size();i++){ 44 path = drawList.get(i).getPath(); 45 paint = drawList.get(i).getPaint(); 46 canvas.drawPath(path, paint); //Pathの描画 47 } 48 49 invalidate(); //再描画 50 } 51 52 //タッチしたら線を描く(タッチイベントメソッド) 53 public boolean onTouchEvent(MotionEvent event){ 54 55 float x = event.getX(); 56 float y = event.getY(); 57 58 switch (event.getAction()){ 59 case MotionEvent.ACTION_DOWN: //画面をタッチした! 60 drawList.add(new DrawInfo(path, paint)); 61 path.moveTo(x-1, y-1); //Pathの始点 62 break; 63 64 case MotionEvent.ACTION_MOVE: //タッチしながらスライド 65 path.lineTo(x, y); 66 break; 67 68 case MotionEvent.ACTION_UP: 69 //指をやっと離した 70 path.moveTo(x, y); //移動先の追加  71 72 break; 73 } 74 75 return true; 76 } 77 78 79 80 81//色を選択するメソッド,Spinnerの文字列をもらってくる 82 public void setColor(String color){ 83 84 switch(color){ 85 case "あか": 86 paint.setColor(Color.RED); 87 break; 88 89 case "オレンジ": 90 int orange = Color.rgb(255,165,0); 91 paint.setColor(orange); 92 break; 93 case "きいろ": 94 paint.setColor(Color.YELLOW); 95 break; 96 case "みどり": 97 paint.setColor(Color.GREEN); 98 break; 99 case "ちゃいろ": 100 paint.setColor(Color.rgb(102,51,0)); 101 break; 102 103 case "くろ": 104 paint.setColor(Color.BLACK); 105 break; 106 } 107 } 108 109 110public class DrawInfo { 111 public Path path; 112 public Paint paint; 113 114 public DrawInfo(Path path, Paint paint){ 115 this.paint = paint; 116 this.path = path; 117 118 paint = new Paint(); 119 path = new Path(); 120 } 121 122 public Path getPath() { 123 return path; 124 } 125 126 public void setPath(Path path) { 127 this.path = path; 128 } 129 130 public Paint getPaint() { 131 return paint; 132 } 133 134 public void setPaint(Paint paint) { 135 this.paint = paint; 136 } 137}

}

試したこと

はじめ、Pathのみに対してArrayListを作成したところ、新しい色を選んだと同時にこれまで書いていた線もその色で上書きされてしまうことがわかりました。
そのため、線ごとにPathとPaint情報をDrawInfoでひとまとめにして、そのArrayList(DrawList)を作成したつもりなのですが、実行すると仮想マシンが固まってしまいます。(エラーがどこに表示されるかもわからないので、それもお教えいただけると幸いです)

補足情報(FW/ツールのバージョンなど)

Android Studio 3.4.1
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

試してないので、間違っていたら申し訳ないのですが、
ここが気になります。

java

1@Override 2protected void onDraw(Canvas canvas) { 3 ... 4 invalidate(); //再描画 5}

invalidate()がそもそも何をするメソッドなのかと考えると、
onDraw()の中で書いたらダメです。
自分の認識ではこうです。

(1) Viewにおける描画はonDraw()で行われます。
(2) invalidate()は再描画を行うメソッドである
(3) 再描画とは(1)を前提にすると、onDraw()を呼び出す事である

(1)~(3)により、onDraw()の中でinvalidate()を実行すると、無限ループに陥ってしまうので
アプリが固まる事になると考えます。

なので、onDraw()の最後に実行しているinvalidate()の行を削除すれば良いと思います。

投稿2019/07/07 15:32

mingos

総合スコア4025

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

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

退会済みユーザー

退会済みユーザー

2019/07/08 09:53

回答ありがとうございます。invalidateについては自分の中でもぼんやり書いていたので、お教えいただいてようやく理解できました。 invalidate()を削除しました。 ですが、今度はアプリが開くようになったものの、描画しようとタッチした瞬間に落ちてしまいます。 ほかに原因はありませんかね・・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問