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

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

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

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

Q&A

解決済

1回答

796閲覧

Android Studioで絵を描くアプリを作成しているのですが、タッチした色に変更することができません。

satokoro

総合スコア13

Android Studio

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

0グッド

0クリップ

投稿2018/09/09 20:50

編集2018/09/10 09:56

前提・実現したいこと

Android Studioで絵を描くアプリを作成しようとしています。
ボタンを押した色で線を描きたいのですが、色を変えた際に今まで書いた線全ての色が変わってしまいます。
一つ前に戻るボタンも作成予定なので、そこも踏まえていい方法はないかと考えています。
上手くいかず困っているので、どうかアドバイスの方お願い致します。
初心者のため、分かりやすい表現等で伝えて頂けるとありがたいです。

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

エラーメッセージ

該当のソースコード

import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; import static android.graphics.Color.rgb; import static app.myapplication1.R.drawable.kuro; import static app.myapplication1.R.drawable.pi; import static app.myapplication1.R.drawable.reset; import static app.myapplication1.R.drawable.ye; public class Oekaki3 extends AppCompatActivity { private Paint paint1; private Path path1; private ArrayList<Path> draw_List = new ArrayList<>(); private float pos_x, pos_y; int ket = 0; //ペンをセット protected void setPen(int selColor, float penWidth) { paint1 = new Paint(); paint1.setAntiAlias(true); paint1.setColor(selColor); paint1.setStyle(Paint.Style.STROKE); paint1.setStrokeWidth(penWidth); paint1.setStrokeCap(Paint.Cap.ROUND); paint1.setStrokeJoin(Paint.Join.ROUND); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_oekaki3); TextView textView = new TextView(this); setContentView(textView); setPen(rgb(0, 0, 0), 15);//黒 } class TextView extends View { private Paint paint2; private Path path2; public TextView(Context context) { super(context); this.path2 = new Path(); this.paint2 = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path2, paint2); canvas.drawColor(Color.rgb(255, 255, 255));//白 Path path = new Path(); paint2.setStyle(Paint.Style.STROKE); paint2.setStrokeWidth(5); Bitmap res = BitmapFactory.decodeResource(getResources(), reset); canvas.drawBitmap(res, 2350, 30, paint2); Bitmap ku = BitmapFactory.decodeResource(getResources(), kuro); canvas.drawBitmap(ku, 2350, 450, paint2); Bitmap kk = BitmapFactory.decodeResource(getResources(), ye); canvas.drawBitmap(kk, 2350, 600, paint2); Bitmap pp = BitmapFactory.decodeResource(getResources(), pi); canvas.drawBitmap(pp, 2350, 750, paint2); for (int i = 0; i < draw_List.size(); i++) { Path pt = draw_List.get(i); canvas.drawPath(pt, paint1); } if (path1 != null) { canvas.drawPath(path1, paint1); } } @Override public boolean onTouchEvent(MotionEvent event) {//タッチイベントの開始 pos_x = event.getX(); pos_y = event.getY(); Log.d("TouchEvent", "X:" + event.getX() + ",Y:" + event.getY()); if (pos_x > 2350 && pos_x < 2590 && pos_y > 50 && pos_y < 240) {//はじめから path1.reset(); draw_List.clear(); invalidate(); } else if (pos_x > 2350 && pos_x < 2590 && pos_y > 450 && pos_y < 600) { draw_List.add(path1); setPen(rgb(50, 50, 50), 20); //黒 } else if (pos_x > 2350 && pos_x < 2590 && pos_y > 600 && pos_y < 750) { draw_List.add(path1); paint1.setColor(rgb(255, 200, 80));//黄色 } else if (pos_x > 2350 && pos_x < 2590 && pos_y > 750 && pos_y < 900) { draw_List.add(path1); setPen(rgb(255, 203, 255), 20); //ピンク } else { //指のタッチ開始から、スライド、終わりまでの座標 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path1 = new Path(); path1.moveTo(pos_x, pos_y); break; case MotionEvent.ACTION_MOVE: path1.lineTo(pos_x, pos_y); break; case MotionEvent.ACTION_UP: path1.lineTo(event.getX(), event.getY()); path2.reset(); draw_List.add(path1); break; } } invalidate(); return true;//タッチイベントの消費 } } }

試したこと

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

androidstudio3.0.1

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

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

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

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

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

kakajika

2018/09/10 04:56

読みにくいのでコードは```で囲ってください。
guest

回答1

0

ベストアンサー

onDrawメソッドが呼ばれるたびに全Pathの再描画を行っているわけですから、Pathごとに色(や線幅)を変えたいのであればその都度Paintの設定を変更する必要があります。以下のように、Pathとそれに対応するPaintを1つのデータとしてそのリストを持つように変更してみてください。

java

1public class DrawInfo { 2 public final Path path; 3 public final Paint paint; 4 5 public DrawInfo(Path path, Paint paint) { 6 this.path = new Path(path); 7 this.paint = new Paint(paint); 8 } 9} 10 11public class Oekaki3 extends AppCompatActivity { 12 ... 13 private List<DrawInfo> draw_List = new ArrayList<>(); 14 ... 15 16 class TextView extends View { 17 18 @Override 19 protected void onDraw(Canvas canvas) { 20 ... 21 22 // 各pathとそれに対応するpaintを取り出し描画する 23 for (int i = 0; i < draw_List.size(); i++) { 24 DrawInfo info = draw_List.get(i); 25 canvas.drawPath(info.path, info.paint); 26 } 27 28 ... 29 } 30 31 @Override 32 public boolean onTouchEvent(MotionEvent event) { 33 ... 34 35 // 現在のpath1とpaint1をセットで保存 36 draw_List.add(new DrawInfo(path1, paint1)); 37 setPen(rgb(50, 50, 50), 20); 38 39 ... 40 } 41}

投稿2018/09/10 10:57

編集2018/09/12 04:39
kakajika

総合スコア3131

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

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

satokoro

2018/09/11 12:17

分かりやすい回答ありがとうございます。無事色を変更することが出来ました。 しかし、123と黒で記入した後に、黄色で123と書くと、黒で描いた最後の3までが黄色に変わってしまいました..。for文などでいじってみたりしたのですが分かりません。 よろしければ再び助言の方お願い致します。
kakajika

2018/09/11 13:22

黄色に変更するところのコードが他とは違ってpaint1.setColor(...)になっているからではないですか? それだとPaintのインスタンスを新規生成しないので前のデータと共有になってしまいます。setPenを使ってください。
satokoro

2018/09/11 15:44

再びコメントありがとうございます。黄色の所をsetPenに直しましたが、まだ前と同じような動作になってしまいます。黄色からピンク、ピンクから黒などに変更した場合も同様に、ひとつ前の線も一緒に変わってしまいます...。
kakajika

2018/09/12 04:41

うーん、ややこしそうなので描画情報保存の際に別のPath/Paintインスタンスを生成して保存するように回答を修正しておきました。そちらを反映してみてください。
satokoro

2018/09/16 12:14

ご指摘のあった通りに変更した後、pathのresetの場所を変更した所、無事に色が正しく変わるようになりました^^本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問