
AndroidでOnTouchListenerを使ったタッチ処理サンプル@tryOnTouchListener00

OnTouchListenerのonTouchを使ってタッチに対する処理をする。
OnTouchListenerの場合onTouchEventとは違ってコントロール個別の
(Button,SurfaceViewとか)タッチを検知できる。
動的にコントロールを配置してレイアウトを作る
main.xmlは使わない。
動的にGLSurfaceViewをはめ込む。
画面いっぱいにボタンを配置
●大事なところ
setOnTouchListenerを忘れない。
●関連項目
onTouch
MotionEvent
getHistoricalX
getHistoricalY
getX
getY
getHistorySize
getPointerCount
開発環境
Eclipse IDE バージョン: 3.7 Indigo Service Release 1
ターゲットプラットフォーム: 2.3.3
API レベル: 10
package trial.sample.tryontouchlistener00; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class TryOnTouchListener00Activity extends Activity // OnTouchを使うために。 // 別のクラスでイベントを受け取りたいときはそっち側にこれを // 書いてそっちでonTouchを書く。 // OnTouchEventはActivity全体のタッチ処理だけど // OnTouchListenerを使った場合は個別のViewに対してタッチを // 受け取ることができるってことか! // 例えばSurfaceViewだけのタッチに対する処理をする...とか。 implements OnTouchListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // タイトルは無しで。 this.requestWindowFeature(Window.FEATURE_NO_TITLE); // レイアウトを作って設定 LinearLayout layout = new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255, 255, 0)); layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); layout.setOrientation(LinearLayout.VERTICAL); this.setContentView(layout); // テキストボックス表示する final TextView text = new TextView(this); // テキストサイズを大きめに text.setTextSize(45); text.setText("確認はLogCatで!ここはタッチの範囲じゃないです。"); layout.addView(text); // テキストボックス表示する final Button btn = new Button(this); btn.setText("これはボタンです。OnTouchListenerは登録されてません。タッチは検知されません。"); layout.addView(btn); // GLSurfaceViewを作る final SurfaceView surfaceView = new SurfaceView(this); surfaceView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); surfaceView.setOnTouchListener(this); surfaceView.setBackgroundColor(Color.CYAN); layout.addView(surfaceView); } //////////////////////////////////////////////////////////// // タッチされたイベントが全部こっちにくる public boolean onTouch(View v, MotionEvent event) { String currAction = ""; //////////////////////////////////////////////////////////// // イベントの状態を調べる switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: currAction = "DOWN"; break; case MotionEvent.ACTION_MOVE: currAction = "MOVE"; break; case MotionEvent.ACTION_UP: currAction = "UP"; break; case MotionEvent.ACTION_CANCEL: currAction = "CANCEL"; break; } //////////////////////////////////////////////////////////// // タッチされている箇所を全部表示 // タッチされている箇所(人差し指と親指で触ってるとか) int touchedPointCount = event.getPointerCount(); // タッチされている座標 for (int i = 0; i < touchedPointCount; i++) { Log.v(currAction + " TOUCH[" + i + "]", "(" + event.getX(i) + "," + event.getY(i) + ")"); } //////////////////////////////////////////////////////////// // MOVEイベントの履歴(画面を指でスライドさせてるとき) // MOVEイベントが起こった数 int moveHistoryCount = event.getHistorySize(); // 新しい順に取り出す(最新は一番後ろ) for (int i = moveHistoryCount - 1; 0 <= i; i--) { for (int j = 0; j < touchedPointCount; j++) { Log.v(currAction + " HISTORY[" + i + "]", "(" + event.getHistoricalX(j, i) + "," + event.getHistoricalY(j, i) + ")"); } } // false返すと初回タッチだけ検知するみたい // 一度指を話すまではonTouchメッセージが飛ばない // ゲームのキー入力で言うトリガみたいなもんだと思う。 // キー入力の判定が終わった時にfalseを返すようにすればいいのか // trueしてる場合はView::onTouchEventと同じようなことになる return true; } }
AndroidのonTouchEventを使ってタッチパネルのタップの判定サンプル@trySc... AndroidのSimpleOnGestureListenerを使ってジェスチャー(フリック、長押し...