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

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でOnTouchListenerを使ったタッチ処理サンプル@tryOnTouch...)