【教えてください】TouchListenerについて

857 views
Skip to first unread message

リントヴルム

unread,
Sep 11, 2013, 5:58:50 AM9/11/13
to android-g...@googlegroups.com
こんばんは。
4月からAndroid開発もJavaも始めたばかりの初心者ですが、質問させていただきます。
一度Touchされ、そのタッチが終了(ACTION_UP検出)したら次にタッチされてもイベントが起こらないように
したいのですがどのようにすればいいでしょうか?
TouchListenerを無効にする方法などあれば教えていただきたいです。
 
以下ソースです。
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
// ______________________________________________________________________________
/**
 * 落書きビュー
 *
 */
public class GraffitiView extends View implements OnTouchListener {
    private Bitmap mWallBitmap; // 落書きされるビットマップ
    private Canvas mWallCanvas; // 落書きするためのキャンバス
    // ______________________________________________________________________________
    /**
     * コンストラクタ
     * @param context コンテキスト
     */
    public GraffitiView(Context context) {
        super(context);
        // タッチリスナーをセットする
        this.setOnTouchListener(this);
    }

    // ______________________________________________________________________________
    /**
     * コンストラクタ
     * @param context
     * @param attrs
     * @param defStyle
     */
    public GraffitiView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // タッチリスナーをセットする
        this.setOnTouchListener(this);
    }
    // ______________________________________________________________________________
    /**
     * コンストラクタ
     * @param context
     * @param attrs
     */
    public GraffitiView(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(0xf9ffffff);
        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();
    // ______________________________________________________________________________
    /**
     * タッチされた時の処理
     */
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // タッチされた座標を取り出す
        float x = event.getX();
        float y = event.getY();
        Log.i("TOUCH:", "x: " + x + "y: " + y);
        // アクションを取り出し
        int action = event.getAction();
        switch (action) {
            // タッチ開始
            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;
 
                Log.i("BOUNDS", "l: " + bounds.left + " r: " + bounds.right + " t: " + bounds.top + " b: " + bounds.bottom);
                // 再描画通知
                this.invalidate();
                break;
            // タッチしたまま指が動かされた
            case MotionEvent.ACTION_MOVE:
                // パスをセットする
                this.mPath.lineTo(x, y);
                // ここまでの状態を書き込む
                this.drawPath(this.mWallCanvas, this.mPath);
                // 再描画通知
                this.invalidate();
                break;
        }

        return false;
    }

    // ______________________________________________________________________________
    /**
     * BOXを描く
     * @param canvas キャンバス
     * @param r 矩形
     */
    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);
    }
    // ______________________________________________________________________________
    /**
     * パスに沿って線を書く
     * @param canvas キャンバス
     * @param path パス
     */
    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);
    }
}
 
よろしくお願いいたします。

Makoto Yamazaki

unread,
Sep 11, 2013, 6:39:00 AM9/11/13
to android-g...@googlegroups.com
zaki です。

コードを見てないですが、タッチに反応する必要がなくなったら
setOnTouchListener で null をセットしておけばいいのではないでしょうか。


2013/9/11 リントヴルム <zyunzy...@gmail.com>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto
Reply all
Reply to author
Forward
0 new messages