Androidプログラマへの道 〜 Moonlight 明日香 〜 - タッチイベントを取得する
タッチパネルを操作すると, タッチイベント(Touch Event)がACTION_DOWN→ACTION_MOVE(繰返し)→ACTION_UPの順に発生する.
このタッチイベントを取得するには, onTouchEventメソッドをオーバーライドする.
また, dispatchTouchEventメソッドをオーバーライドしても, 同様の情報を取得することができる. dispatchTouchEventメソッドは, onTouchEventメソッドよりも先にコールされる.

アクティビティで取得する

    • Activity#onTouchEventメソッドをオーバーライドする.
    • MotionEvent#getXメソッド, getYメソッドで, タッチされたx, y座標を取得できる.
    • MotionEvent#getActionメソッドの値をMotionEvent.ACTION_MASKでマスクすることにより, タッチアクション(DOWN/MOVE/UP/CANCEL)を取得できる.
    • MotionEvent#getEventTimeメソッドで, イベント発生時刻(ms)を取得できる. (サンプルコードでは未使用)
package com.moonlight_aska.android.touchevent01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

public class TouchEvent01 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    float x = event.getX();
    float y = event.getY();
    String action = "";

    switch(event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
      action = "Touch Down";
      break;
    case MotionEvent.ACTION_MOVE:
      action = "Touch Move";
      break;
    case MotionEvent.ACTION_UP:
      action = "Touch Up";
      break;
    case MotionEvent.ACTION_CANCEL:
      action = "Touch Cancel";
      break;
    }
    Log.v("Touch", action + " x=" + x + ", y=" + y);
    return super.onTouchEvent(event);
  }
}


Viewで取得する

    • View#onTouchEventメソッドをオーバーライドする.
    • MotionEvent#getXメソッド, getYメソッドで, タッチされたx, y座標を取得できる.
    • MotionEvent#getActionメソッドやgetEventTimeメソッドもActivity同様使用できる.
package com.moonlight_aska.android.touchevent02;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class TouchEvent02 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MyView view = new MyView(this);
    setContentView(view);
  }
}

class MyView extends View {
  private ArrayList<Point> points = new ArrayList<Point>();

  public MyView(Context context) {
    super(context);
    setFocusable(true);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawColor(Color.WHITE);
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setStrokeWidth(3);
    Point po = null;
    for(int i=0; i<points.size(); i++) {
      po = points.get(i);
      canvas.drawPoint(po.x, po.y, paint);
    }
    super.onDraw(canvas);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    int x = (int)event.getX();
    int y = (int)event.getY();
    points.add(new Point(x, y));
    invalidate(); // 通知
    return true;
  }
}