カスタムビューでタッチイベントを受け取れない問題

カスタムビューsetOnTouchListenerを実装してタッチイベントを受け取ろうとするとeclipseでは次のような警告が出ることがあります。

eclipseでの警告

この場合はカスタムビューにperformClickonTouchEventを定義すれば期待通りに動くようになります。

/**カスタムビュー*/
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が呼ばれ、長押しを感知できるようになります。

以上、カスタムビューでのタッチイベントの受け取りでした。では、また!

関連項目
プライバシーポリシー