Touchイベントの描画

初めてのAndroidでTouchイベントについて学びましたが、その際は画像のズーム、ドラッグでした。せっかくなので、タッチされた座標を点で表示するようなプログラムを書いてみました。

Activityにはキャンバスを表示するように設定します。

[sourcecode language="java"] public class TouchWithCanvas extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // キャンバスを表示する
    CanvasView canvasView = new CanvasView(this);
    setContentView(canvasView);
}

} [/sourcecode]

viewを継承したクラスを作成し、そこでTouchイベントの取得と画面描画を行います。

[sourcecode language="java"] public class CanvasView extends View{

private static final String TAG = "CanvasView";
Paint paint1 = new Paint();
Paint paint2 = new Paint();

private float pointX1 = 0.0f;
private float pointY1 = 0.0f;

private float pointX2 = 0.0f;
private float pointY2 = 0.0f;

public CanvasView(Context context) {
    super(context);
}

@Override
protected void onDraw(Canvas canvas) {
    drawPoint(canvas);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    Log.d(TAG, "onTouchEvent");

    // getActionメソッドの戻り値の下位8ビットがアクションコードとなる為マスクする
    int maskedEventAction = event.getAction() & MotionEvent.ACTION_MASK;

    if(maskedEventAction == MotionEvent.ACTION_DOWN){
        Log.d(TAG, "MotionEvent.ACTION_DOWN");
        Log.d(TAG, "pointX1 = " + pointX1 + " / pointY1 = " + pointY1);

        pointX1 = event.getX();
        pointY1 = event.getY();
    }
    else if(maskedEventAction == MotionEvent.ACTION_MOVE){
        Log.d(TAG, "MotionEvent.ACTION_MOVE");
        Log.d(TAG, "pointX1 = " + pointX1 + " / pointY1 = " + pointY1);

        pointX1 = event.getX();
        pointY1 = event.getY();
    }
    else if(maskedEventAction == MotionEvent.ACTION_UP){
        Log.d(TAG, "MotionEvent.ACTION_UP");
        Log.d(TAG, "pointX1 = " + pointX1 + " / pointY1 = " + pointY1);

        pointX1 = event.getX();
        pointY1 = event.getY();
    }
    else if(maskedEventAction == MotionEvent.ACTION_POINTER_DOWN) {
        Log.d(TAG, "MotionEvent.ACTION_POINTER_DOWN");
        Log.d(TAG, "pointX2 = " + pointX2 + " / pointY2 = " + pointY2);

        pointX2 = event.getX();
        pointY2 = event.getY();
    }
    else if(maskedEventAction == MotionEvent.ACTION_POINTER_UP) {
        Log.d(TAG, "MotionEvent.ACTION_POINTER_UP");
        Log.d(TAG, "pointX2 = " + pointX2 + " / pointY2 = " + pointY2);

        pointX2 = event.getX();
        pointY2 = event.getY();
    }

    // 再描画の指示
    invalidate();

    return true;
}

private void drawPoint(Canvas canvas) {

    Log.d(TAG, "drawPoint");

    paint1.setColor(Color.BLUE);
    paint2.setColor(Color.RED);

    paint1.setStrokeWidth(30);
    paint2.setStrokeWidth(30);

    if(pointX1 != 0.0f && pointY1 != 0.0f) {
        canvas.drawPoint(pointX1, pointY1, paint1);
    }

    if(pointX2 !=0.0f && pointY2 != 0.0f) {
        canvas.drawPoint(pointX2, pointY2, paint2);
    }
}

}

[/sourcecode]

実行結果はこんな感じです。 

いまいちセンスがないですが、とりあえずTouchイベントがどういうものかわかったので良しとします。