web-dev-qa-db-ja.com

onClickの代わりにView.OnTouchListenerを使用する方法

クライアント用にAndroid 2.2.2アプリケーションを開発していますが、彼は次のことをしたいと考えています。

現在、onClickイベントを持つボタンがありますが、彼は好まないので、ユーザーがボタンを離したときに決定したいと考えています。

View.OnTouchListener を見つけました。これは使用する必要があると思いますが、onClickで行ったようにこのイベントをxmlに追加する可能性はありますか?

<ImageButton
    Android:id="@+id/btnSaveNewGate"
    Android:layout_width="@dimen/btnSaveNewGate_width"
    Android:layout_height="@dimen/btnSaveNewGate_height"
    Android:layout_below="@+id/radioGrGateType"
    Android:layout_centerHorizontal="true"
    Android:layout_marginTop="@dimen/btnSaveNewGate_marginTop"
    Android:background="@null"
    Android:contentDescription="@string/layout_empty"
    Android:onClick="onSaveNewGateClick"
    Android:scaleType="fitXY"
    Android:src="@drawable/save_gate_selector" />

さらに2つの質問があります。

ユーザーが指を離したときに関連付けられるイベントはどれですか?

onClickの代わりにView.OnTouchListenerの使用を禁止するガイドラインはありますか?

41
VansFannel

ユーザーが指を離したときのイベントはMotionEvent.ACTION_UP。 onClick()の代わりにView.OnTouchListenerを使用することを禁止するガイドラインがあるかどうかはわかりませんが、おそらく状況によって異なります。

サンプルコードを次に示します。

imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP){

            // Do what you want
            return true;
        }
        return false;
    }
});
72
Andy Res

おそらく、OnTouchListenerではなくOnClickListenerを使用する場合は、OnTouchListenerの追加機能が必要です。これは、OnTouchListenerの使用方法の詳細を示す補足的な回答です。

リスナーを定義する

これをアクティビティまたはフラグメントのどこかに配置します。

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};

リスナーを設定する

onCreate(アクティビティの場合)またはonCreateView(フラグメントの場合)でリスナーを設定します。

myView.setOnTouchListener(handleTouch);

  • getXgetYは、ビュー(つまり、ビューの左上隅)に相対的な座標を提供します。ビューの上または左に移動すると、それらは負になります。画面の絶対座標が必要な場合は、getRawXgetRawYを使用します。
  • xおよびyの値を使用して、スワイプの方向などを決定できます。
11
Suragch

OnClickは、ユーザーがボタンを離したときにトリガーされます。ただし、TouchListenerを引き続き使用する場合は、コードに追加する必要があります。それはただ:

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});
5
CaseyB