rel@zx勉強雑記。
AndroidやゲームAIなどの覚書など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんばんは。
明日は雪と聞いて戦々恐々のrel@zxです。
さて、今日はAndroidプログラムをちょっとやっていたのですが、
マルチタッチ実装に思った以上に苦労したので覚書き。
明日は雪と聞いて戦々恐々のrel@zxです。
さて、今日はAndroidプログラムをちょっとやっていたのですが、
マルチタッチ実装に思った以上に苦労したので覚書き。
1.Androidにおけるタッチ取得の基本
まず、タッチのイベント時、onTouchEvent関数が呼ばれます。
この関数は必ずboolean型の true か、 falseを返さなければなりません。
シングルでもマルチタッチでもこの関数を使います。
ここからは、行いたいことにより中身が変わってきます。
2.シングルタッチ
座標を取るだけなら、以下のように実装出来ます。
間にいろいろやったため抜けてる可能性もあるので指摘していただければ幸いです。
そんなこんなで思い描いてた動きが実現できたので、ボチボチ新プロジェクトも
進めていきたいと思います。
ではでは~。
まず、タッチのイベント時、onTouchEvent関数が呼ばれます。
この関数は必ずboolean型の true か、 falseを返さなければなりません。
シングルでもマルチタッチでもこの関数を使います。
ここからは、行いたいことにより中身が変わってきます。
2.シングルタッチ
座標を取るだけなら、以下のように実装出来ます。
@Override
public boolean onTouchEvent(MotionEvent event) {
touch_x = (int)event.getX();
touch_y = (int)event.getY();
return true;
}
touch_xとtouch_yでメンバー変数です。
注意点としては、getXとgetY関数はfloat型を返します。
3.マルチタッチ
今回は2点タッチでやります。
ハードウェアにもよりますが、これ以上も同じ要領で出来ます。
注意点としては、getXとgetY関数はfloat型を返します。
3.マルチタッチ
今回は2点タッチでやります。
ハードウェアにもよりますが、これ以上も同じ要領で出来ます。
@Override
public boolean onTouchEvent(MotionEvent event) {
// 1番目のタッチ取得
int pointerIndex = event.findPointerIndex(0);
touch_x0 = (int)event.getX(pointerIndex);
touch_y0 = (int)event.getY(pointerIndex);
// 2番目のタッチ取得
pointerIndex = event.findPointerIndex(1);
touch_x1 = (int)event.getX(pointerIndex);
touch_y1 = (int)event.getX(pointerIndex);
return true;
}
シングルタッチとほぼ同じですが、getXとgetY関数の引数として
n番目のポインターを渡すことが違っています。
あとはこの結果を元に画像表示位置などに反映するだけで完成です。
4.応用編
ここからは、少し応用ということで細かい事をやってみます。
(a)タッチ中、タッチしたまま指を移動、指を離した瞬間でそれぞれ処理を割り当て
getAction関数で動作の種類が取得できるので、それで分岐させます。
n番目のポインターを渡すことが違っています。
あとはこの結果を元に画像表示位置などに反映するだけで完成です。
4.応用編
ここからは、少し応用ということで細かい事をやってみます。
(a)タッチ中、タッチしたまま指を移動、指を離した瞬間でそれぞれ処理を割り当て
getAction関数で動作の種類が取得できるので、それで分岐させます。
@Override
public boolean onTouchEvent(MotionEvent event) {
int actionType = event.getAction();
switch(actionType) {
case MotionEvent.ACTION_DOWN :
// 押されている
Log.d("ActionType", "Down");
break;
case MotionEvent.ACTION_MOVE :
// タッチしたまま指を移動
Log.d("ActionType", "Move");
break;
case MotionEvent.ACTION_UP :
// 指を離した瞬間
Log.d("ActionType", "UP");
break;
}
return true;
}
今回は3つだけ例に挙げましたが、他にもACTION_CANCELなどもあります。
タッチセンサーによりけりですが、DOWNとUPの差がシビアかな、と…。
(b)シングルタッチとマルチタッチの共存
という訳で今回のメインテーマ、シングルタッチとマルチタッチの共存です。
getPointerCount関数でタッチ数が取得できるので、それで分岐させます。
…謎仕様なのですが、何も押されていない時でも0ではなく、1を返しているようです。
最初の起動時は確かに0を返しているようなので、指を離したことを明示的に
通知する関数があるのか、そのあたりが不明です。もしかしたらバグなのかも?
どうしても指が離れた時に呼び出したくない場合は、
if (eventType != MotionEvent.ACTION_UP) を満たす時のみ
分岐にいくようにすれば実現できます。
タッチセンサーによりけりですが、DOWNとUPの差がシビアかな、と…。
(b)シングルタッチとマルチタッチの共存
という訳で今回のメインテーマ、シングルタッチとマルチタッチの共存です。
getPointerCount関数でタッチ数が取得できるので、それで分岐させます。
…謎仕様なのですが、何も押されていない時でも0ではなく、1を返しているようです。
最初の起動時は確かに0を返しているようなので、指を離したことを明示的に
通知する関数があるのか、そのあたりが不明です。もしかしたらバグなのかも?
どうしても指が離れた時に呼び出したくない場合は、
if (eventType != MotionEvent.ACTION_UP) を満たす時のみ
分岐にいくようにすれば実現できます。
@Override
public boolean onTouchEvent(MotionEvent event) {
int pointCount = event.getPointerCount();
switch(pointCount ) {
case 1 :
// シングルタッチ
// なぜか一回目のタッチ以降は
// 指を離してもここが呼ばれる。
Log.d("TouchCount", "Single");
break;
case 2 :
// マルチタッチ
Log.d("TouchCount", "Multi");
break;
}
return true;
}
間にいろいろやったため抜けてる可能性もあるので指摘していただければ幸いです。
そんなこんなで思い描いてた動きが実現できたので、ボチボチ新プロジェクトも
進めていきたいと思います。
ではでは~。
PR
COMMENT FORM
COMMENT
