タッチパネルを操作すると, タッチイベント(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;
}
}