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;
}
}