マルチタッチとはその名の通り2点以上を同時にタッチしたものを検出することです
Androidでは 2.0(API 5)以降でマルチタッチがサポートされ使用可能です
それぞれの発生イベント一覧
ACTION_DOWN: タッチパネルがまだタッチされていない状態で、タッチパネルを押した場合
ACTION_MOVE: タッチパネルを押したままスライドさせた場合
ACTION_POINTER_DOWN: タッチパネルの一箇所以上をタッチしている状態で、さらにタッチパネルを押した場合
ACTION_POINTER_UP: タッチパネルの二箇所以上をタッチしている状態で、うち一箇所を離した場合
ACTION_UP: タッチパネルがまだタッチされていない状態で、タッチパネルから指を持ち上げた場合
つまり複数の指でタッチパネルを操作するとタッチイベント(Touch Event)が
1点目タッチ:ACTION_DOWN
2点目タッチ:ACTION_POINTER_DOWN
→ACTION_MOVE(繰返し)→
2点目離し:ACTION_POINTER_UP
1点目離し:ACTION_UP
の順に発生します
イベントをアクティビティで取得する
複数タッチイベントもアクティビティ内で取得する方法と
View内で取得する方法の2種類があります
今回はアクティビティ内で取得します
基本的にはアクティビティ内でTouchEventを取得するものの応用編となります
主な項目のみ挙げると
まずonTouchEventを作成します
getActionでどのようなタッチアクションをしたかの情報を取得します
getPointerCounではタッチ数を取得します
そしてタッチアクション情報をMotionEvent.ACTION_POINTER_ID_MASKでマスクして
MotionEvent.ACTION_POINTER_ID_SHIFT分シフトすることで
ポインタIDを取得するためのインデックスを取得しています
“>>”の記号はビット操作演算子と言われていて
ビット列を右や左にシフトします
getX・getYではタッチされたx・y座標を取得しています
今回はそれぞれのアクションイベントとポイント座標をログとして出力しています
MainActivity.java
package blog.test; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; public class MainActivity 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) { //タッチアクションの情報を取得 int action = event.getAction(); //タッチ数を取得 int count = event.getPointerCount(); int id = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; //イベントごとにログを出力 switch(action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: Log.i("tag", "Touch Down" + " count=" + count + ", id=" + id); break; case MotionEvent.ACTION_POINTER_DOWN: Log.i("tag", "Touch PTR Down" + " count=" + count + ", id=" + id); break; case MotionEvent.ACTION_UP: Log.i("tag", "Touch Up" + " count=" + count + ", id=" + id); break; case MotionEvent.ACTION_POINTER_UP: Log.i("tag", "Touch PTR Up" + " count=" + count + ", id=" + id); break; case MotionEvent.ACTION_MOVE: Log.i("tag", "Touch Move" + " count=" + count + ", id=" + id); break; } for(int i=0; i<count; i++) { Log.i("tag", " X=" + event.getX(i) + ", Y=" + event.getY(i) + ", id=" + event.getPointerId(i) ); } return super.onTouchEvent(event); } }
今回は実機のgalaxy sで実行してみました
いろいろタッチしてみるとマルチタッチにより次々にログが検出されているのがわかります
スポンサードリンク