前提・実現したいこと
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
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/08 09:53