<< Android-Note
カスタムビューでタッチイベントを受け取れない問題
カスタムビューにsetOnTouchListenerを実装してタッチイベントを受け取ろうとするとeclipseでは次のような警告が出ることがあります。
この場合はカスタムビューにperformClickとonTouchEventを定義すれば期待通りに動くようになります。
/**カスタムビュー*/ public class MyView extends View { MyView(Context context) { super(context); } @Override public boolean performClick() { super.performClick(); return true; } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_UP: performClick(); break; default: break; } return true; } }
カスタムビューだとこうしないとタッチを受け取ってくれないので注意が必要です。
もし、onTouchEventが呼ばれない場合は、onDispatchEventをオーバーロードしてください。
長押しの受け取り
もし、ビューでsetOnLongClickListenerを設定している場合は、さらにperformLongClickを呼び出す必要があります。
長押しの場合は画面が押されてしばらくした後にperformLongClickを呼び出すことで長押し処理を実装できます。
コードは次のようになります。
long LONG_PRESS_TIME = 1000; Handler handler = new Handler(); Runnable longPressedRunnable = new Runnable() { @Override public void run() { performLongClick(); } }; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: handler.postDelayed(longPressedRunnable, LONG_PRESS_TIME); ///しばらくしたらperformLongClick実行 break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: handler.removeCallbacks(longPressedRunnable); /// 長押しキャンセル performClick(); break; default: break; } return true; } @Override public boolean performLongClick() { super.performLongClick(); return true; }
Runnableを使ってここでは1秒後にperformLongClickを実行しています。
performLongClickが実行されるとOnLongClickListenerが呼ばれ、長押しを感知できるようになります。
以上、カスタムビューでのタッチイベントの受け取りでした。では、また!
© Kaz