サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > AndroidでOnTouchListenerを使ったタッチ処理サンプル@tryOnTouchListener00
Google Play AAKAKAxSOFTへ

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

実行ファイル(APK)やサンプル(zip)をダウンロードする
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;
	}
}
APKファイルをダウンロード サンプルプロジェクトをダウンロード

, , , , ,

AndroidのonTouchEventを使ってタッチパネルのタップの判定サンプル@trySc... AndroidのSimpleOnGestureListenerを使ってジェスチャー(フリック、長押し...

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>