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

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

ただいまの
回答率

90.61%

  • Java

    13512questions

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

  • Android

    6417questions

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

  • Android Studio

    3619questions

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

Android Studio)削るスクラッチくじのnextボタン

解決済

回答 1

投稿 編集

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

navesanta

score 89

削るスクラッチくじを使ったアプリを試しに作っているのですが削った後、元に戻す方法が分からないので分かる方教えて下さい。

やったこと)
1)削るアクションが起こせるScratchView.javaを作成
2)activity_main.xml内にRelativeLayoutを使って重ねるようにして
前面に1)で作成したScratchViewを指定、後面にTextViewを設置
3)MainActivity.javaにnextボタンでsetOnClickListenerを設置

やりたいこと)
テストRunして画面上でまず削って文字を出します。(ここまでは出来ています)
次にnextボタンを押すと削る前に戻って、削る→nextボタンで戻る→nextボタンで戻る
とできるようにしたいのですがsetOnClickListener内の設定が何を利用したら
良いか分かりません。分かる方、もしくはヒントになりそうなことが分かる方みえましたら教えて下さい。

環境 os mac
開発環境 Android studio 2.2.3

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TextView lotText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button nextButton = (Button)findViewById(R.id.nextButton);
        lotText = (TextView)findViewById(R.id.lottery_result);
        nextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lotText.setText("削った時に表示される文字");
               ☆ここから↓メソッドを追加しました。
                graffitiView.resetDraw();
        
              }
        });
    }
}


activity_main.xml内

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <android.support.v4.widget.Space
                    android:layout_weight="10"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp" />
                <TextView
                    android:id="@+id/lottery_result"
                    android:gravity="center"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="30sp"
                    android:text="テストです"/>
                <android.support.v4.widget.Space
                    android:layout_weight="10"
                    android:layout_width="wrap_content"
                    android:layout_height="0dp" />
            </LinearLayout>
            <com.○○○.scratchmakerapp.ScratchView
                android:id="@+id/view1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </RelativeLayout>


ScratchView.java

public class ScratchView  extends View implements View.OnTouchListener {

    private Bitmap mWallBitmap; // 塗りたくったビットマップ
    private Canvas mWallCanvas; // 元になるキャンバス

    public ScratchView(Context context) {
        super(context);
        // タッチリスナーをセットする
        this.setOnTouchListener(this);
    }
    public ScratchView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // タッチリスナーをセットする
        this.setOnTouchListener(this);
    }
    public ScratchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // タッチリスナーをセットする
        this.setOnTouchListener(this);
    }
    //     * ビューサイズが変更された
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

        // Bitmapを新しく作る
        this.mWallBitmap = null;
        this.mWallBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        // キャンバスを新しく作る
        this.mWallCanvas = null;
        this.mWallCanvas = new Canvas(this.mWallBitmap);

        // アルファで抜いていく画像を適当な透明度で初期化
        this.mWallCanvas.drawColor(0xf9c0c0c0); //ここで色を決める

        super.onSizeChanged(w, h, oldw, oldh);
    }
    //     * 描画通知
    @Override
    protected void onDraw(Canvas canvas) {

        // 落書き用Bitmapに書かれた内容を表へ転送
        canvas.drawBitmap(this.mWallBitmap, 0, 0, null);
        super.onDraw(canvas);
    }
    private Path mPath = new Path();
    //タッチされた時の処理
    public boolean onTouch(View v, MotionEvent event) {

        // タッチされた座標を取り出す
        float x = event.getX();
        float y = event.getY();

        // アクションを取り出し
        switch (event.getAction()) {

            // タッチ開始
            case MotionEvent.ACTION_DOWN:

                // パスをリセットしてから新しい座標をセット
                this.mPath.reset();
                this.mPath.moveTo(x, y);

                // ここまでの状態でパスに沿って線を書く。
                // 最初だから○が描かれるだけ
                this.drawPath(this.mWallCanvas, this.mPath);

                // 再描画通知
                this.invalidate();
                return true;    // ←trueを返さないとACTION_UPがやってこない

            // タッチ終了
            case MotionEvent.ACTION_UP:

                // ここまでのパスをセット
                this.mPath.lineTo(x, y);

                // パスに沿って線を描く
                this.drawPath(this.mWallCanvas, this.mPath);

                // 線で繋がれた範囲のバウンディングボックスの計算
                RectF bounds = new RectF();
                this.mPath.computeBounds(bounds, true);

                // 線の太さ分外側に押し出す
                bounds.left -= 30;
                bounds.right += 30;
                bounds.top -= 30;
                bounds.bottom += 30;

                // バンディングボックスを描く
                this.drawBox(this.mWallCanvas, bounds);

                // 再描画通知
                this.invalidate();
                break;

            // タッチしたまま指が動かされた
            case MotionEvent.ACTION_MOVE:

                // パスをセットする
                this.mPath.lineTo(x, y);

                // ここまでの状態を書き込む
                this.drawPath(this.mWallCanvas, this.mPath);

                // 再描画通知
                this.invalidate();
                break;
        }
        return false;
    }
    //BOXを描く
    private void drawBox(Canvas canvas, RectF r) {

        // 描画設定
        Paint paint = new Paint();
        paint.setDither(true);
        paint.setAntiAlias(true);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
        paint.setColor(0xffff0000);

        // 線を描く
        paint.setStyle(Paint.Style.STROKE);

        // 矩形の指定に従って描き込む
        canvas.drawRect(r, paint);
    }
    //パスに沿って線を書く
    private void drawPath(Canvas canvas, Path path) {

        // 線を書くためのペイント
        Paint paint = new Paint();
        paint.setDither(true);
        paint.setAntiAlias(true);

        // これをすると塗りつぶす方の色が優先される
        // 背景のアルファを無視して下のレイアウトが見えるようになる
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
        paint.setColor(Color.argb(0, 0x00, 0, 0));

        // 線を引く設定(角をどうするかとか)
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeJoin(Paint.Join.ROUND);

        // 太めに
        paint.setStrokeWidth(60);
        canvas.drawPath(path, paint);
    }
   //メソッドを追加
    public void resetDraw(){
        mWallBitmap = null;
        mWallBitmap = Bitmap.createBitmap(1000,1000, Bitmap.Config.ARGB_8888);
        mWallCanvas = null;
        mWallCanvas = new Canvas(mWallBitmap);
        mWallCanvas.drawColor(0xf9c0c0c0);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

初期状態に戻したいということですね?
それならonSizeChanged内で行なっている、初期化処理をメソッド化してonClickで呼び出すと良いですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/01 15:07

    初期化処理をMainActivity内に入れてみました。テストrunして、画面を削って、nextボタンを押してみましたがまったく反応しません。どこが悪いでしょうか?

    キャンセル

  • 2017/10/01 19:17

    メソッド化してください。

    キャンセル

  • 2017/10/02 19:05

    ScratchViewにメソッドを追加してonClickで呼び出すようにしました。しかしうまく挙動しません。よろしくお願いします。

    キャンセル

  • 2017/10/02 19:33

    はい、次は初期化処理の後に再描画リクエストを出します。View#invalidateを呼び出してください。

    キャンセル

  • 2017/10/03 05:50

    うまくいきました。ありがとうございました。これからもよろしくお願いします。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Java

    13512questions

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

  • Android

    6417questions

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

  • Android Studio

    3619questions

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