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
1package trial.sample.tryontouchlistener00; 2 3import android.app.Activity; 4import android.graphics.Color; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.MotionEvent; 8import android.view.SurfaceView; 9import android.view.View; 10import android.view.Window; 11import android.view.View.OnTouchListener; 12import android.widget.Button; 13import android.widget.LinearLayout; 14import android.widget.TextView; 15 16public class TryOnTouchListener00Activity extends Activity 17 // OnTouchを使うために。 18 // 別のクラスでイベントを受け取りたいときはそっち側にこれを 19 // 書いてそっちでonTouchを書く。 20 // OnTouchEventはActivity全体のタッチ処理だけど 21 // OnTouchListenerを使った場合は個別のViewに対してタッチを 22 // 受け取ることができるってことか! 23 // 例えばSurfaceViewだけのタッチに対する処理をする...とか。 24 implements OnTouchListener { 25 26 27 /** Called when the activity is first created. */ 28 @Override 29 public void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 // タイトルは無しで。 32 this.requestWindowFeature(Window.FEATURE_NO_TITLE); 33 34 // レイアウトを作って設定 35 LinearLayout layout = new LinearLayout(this); 36 layout.setBackgroundColor(Color.rgb(255, 255, 0)); 37 layout.setLayoutParams(new LinearLayout.LayoutParams( 38 LinearLayout.LayoutParams.FILL_PARENT, 39 LinearLayout.LayoutParams.FILL_PARENT)); 40 layout.setOrientation(LinearLayout.VERTICAL); 41 this.setContentView(layout); 42 43 // テキストボックス表示する 44 final TextView text = new TextView(this); 45 // テキストサイズを大きめに 46 text.setTextSize(45); 47 text.setText("確認はLogCatで!ここはタッチの範囲じゃないです。"); 48 layout.addView(text); 49 50 // テキストボックス表示する 51 final Button btn = new Button(this); 52 btn.setText("これはボタンです。OnTouchListenerは登録されてません。タッチは検知されません。"); 53 layout.addView(btn); 54 55 // GLSurfaceViewを作る 56 final SurfaceView surfaceView = new SurfaceView(this); 57 surfaceView.setLayoutParams(new LinearLayout.LayoutParams( 58 LinearLayout.LayoutParams.MATCH_PARENT, 59 LinearLayout.LayoutParams.WRAP_CONTENT)); 60 surfaceView.setOnTouchListener(this); 61 surfaceView.setBackgroundColor(Color.CYAN); 62 layout.addView(surfaceView); 63 } 64 65 //////////////////////////////////////////////////////////// 66 // タッチされたイベントが全部こっちにくる 67 public boolean onTouch(View v, MotionEvent event) { 68 69 String currAction = ""; 70 71 //////////////////////////////////////////////////////////// 72 // イベントの状態を調べる 73 switch (event.getAction() & MotionEvent.ACTION_MASK) { 74 case MotionEvent.ACTION_DOWN: 75 currAction = "DOWN"; 76 break; 77 case MotionEvent.ACTION_MOVE: 78 currAction = "MOVE"; 79 break; 80 case MotionEvent.ACTION_UP: 81 currAction = "UP"; 82 break; 83 case MotionEvent.ACTION_CANCEL: 84 currAction = "CANCEL"; 85 break; 86 } 87 88 //////////////////////////////////////////////////////////// 89 // タッチされている箇所を全部表示 90 91 // タッチされている箇所(人差し指と親指で触ってるとか) 92 int touchedPointCount = event.getPointerCount(); 93 94 // タッチされている座標 95 for (int i = 0; i < touchedPointCount; i++) { 96 Log.v(currAction + " TOUCH[" + i + "]", 97 "(" + event.getX(i) + "," + event.getY(i) + ")"); 98 } 99 100 101 //////////////////////////////////////////////////////////// 102 // MOVEイベントの履歴(画面を指でスライドさせてるとき) 103 104 // MOVEイベントが起こった数 105 int moveHistoryCount = event.getHistorySize(); 106 107 // 新しい順に取り出す(最新は一番後ろ) 108 for (int i = moveHistoryCount - 1; 0 <= i; i--) { 109 110 for (int j = 0; j < touchedPointCount; j++) { 111 Log.v(currAction + " HISTORY[" + i + "]", "(" + event.getHistoricalX(j, i) + "," + event.getHistoricalY(j, i) + ")"); 112 } 113 } 114 // false返すと初回タッチだけ検知するみたい 115 // 一度指を話すまではonTouchメッセージが飛ばない 116 // ゲームのキー入力で言うトリガみたいなもんだと思う。 117 // キー入力の判定が終わった時にfalseを返すようにすればいいのか 118 // trueしてる場合はView::onTouchEventと同じようなことになる 119 return true; 120 } 121}