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

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

ただいまの
回答率

90.50%

  • Android Studio

    4302questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 524

satokoro

score 1

 前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kakajika

    2018/09/10 13:56

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

    キャンセル

回答 1

checkベストアンサー

+1

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

public class DrawInfo {
    public final Path path;
    public final Paint paint;

    public DrawInfo(Path path, Paint paint) {
        this.path = new Path(path);
        this.paint = new Paint(paint);
    }
}

public class Oekaki3 extends AppCompatActivity {
    ...
    private List<DrawInfo> draw_List = new ArrayList<>();
    ...

    class TextView extends View {

        @Override
        protected void onDraw(Canvas canvas) {
            ...

            // 各pathとそれに対応するpaintを取り出し描画する
            for (int i = 0; i < draw_List.size(); i++) {
                DrawInfo info = draw_List.get(i);
                canvas.drawPath(info.path, info.paint);
            }

            ...
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            ...

            // 現在のpath1とpaint1をセットで保存
            draw_List.add(new DrawInfo(path1, paint1));
            setPen(rgb(50, 50, 50), 20);

            ...
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/11 21:17

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

    キャンセル

  • 2018/09/11 22:22

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

    キャンセル

  • 2018/09/12 00:44

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

    キャンセル

  • 2018/09/12 13:41

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

    キャンセル

  • 2018/09/16 21:14

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

    キャンセル

同じタグがついた質問を見る

  • Android Studio

    4302questions

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