うっかり間違ったボタンを押した場合、指を範囲外にドラッグしてから離すと、HTMLのフォームのようにキャンセルした扱いにするアプリは数多くあります。
どうやって実装しているのでしょう。
前回OnTouchListenerを実装しました。
ACTION_UPとACTION_CANCELがあるので、「画像上で指を離したときがACTION_UPで、画像の範囲外に指をドラッグして離したときがACTION_CANCELなの?」と思ってみれば違います。
ACTION_CANCELは「押してるときに戻るボタンを押した」とかの本気でキャンセルされた場合にしか呼ばれず、それ以外は大抵ACTION_UPになります。
ですのでACTION_UPに進むボタンを実装してしまうと、うっかり間違って押した場合にキャンセルができなくなってしまいます。
解決策としては、OnTouchListenerとOnClickListenerを併用。
また、範囲外に指を移動してから離した場合は反応しません。
よって画面遷移などの契機とするのに最適なリスナーとなっています。
なお、今度はonTouchの返り値がfalseになっていることに注意です。
こうしないとOnClickListenerに処理が渡りません。
そしてOnClickListenerを実装するとreturn falseでもACTION_UPやACTION_CANCELが反応するようになります。
意味がわからん。
実際他のアプリがどうやって実装してるのかは知らないのですが、これが一番簡単な作り方なのですかね。
どうやって実装しているのでしょう。
前回OnTouchListenerを実装しました。
ACTION_UPとACTION_CANCELがあるので、「画像上で指を離したときがACTION_UPで、画像の範囲外に指をドラッグして離したときがACTION_CANCELなの?」と思ってみれば違います。
ACTION_CANCELは「押してるときに戻るボタンを押した」とかの本気でキャンセルされた場合にしか呼ばれず、それ以外は大抵ACTION_UPになります。
ですのでACTION_UPに進むボタンを実装してしまうと、うっかり間違って押した場合にキャンセルができなくなってしまいます。
解決策としては、OnTouchListenerとOnClickListenerを併用。
view.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View view, MotionEvent motionevent) { switch(motionevent.getAction()){ //押した case MotionEvent.ACTION_DOWN: Log.v("OnTouchListener", "ACTION_DOWN"); break; //離した case MotionEvent.ACTION_UP: Log.v("OnTouchListener", "ACTION_UP"); break; //キャンセルした case MotionEvent.ACTION_CANCEL: Log.v("OnTouchListener", "ACTION_CANCEL"); break; } return false; } }); view.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view) { Log.v("OnClickListener: ", "onClick"); } });OnClickListenerは、名前に反して指を離したときに発動します。
また、範囲外に指を移動してから離した場合は反応しません。
よって画面遷移などの契機とするのに最適なリスナーとなっています。
なお、今度はonTouchの返り値がfalseになっていることに注意です。
こうしないとOnClickListenerに処理が渡りません。
そしてOnClickListenerを実装するとreturn falseでもACTION_UPやACTION_CANCELが反応するようになります。
意味がわからん。
実際他のアプリがどうやって実装してるのかは知らないのですが、これが一番簡単な作り方なのですかね。
PR
トラックバック
トラックバックURL: