削るスクラッチくじを使ったアプリを試しに作っているのですが削った後、元に戻す方法が分からないので分かる方教えて下さい。
やったこと)
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); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/01 06:07
2017/10/01 10:17
2017/10/02 10:05
2017/10/02 10:33
2017/10/02 20:50