2012-05-12 9 views
3

私はAndroidビューの場合、trueからonTouchEventを返すと、現在のジェスチャーのイベントを引き続き受け取りたいことがわかります。あなたがfalseを返す場合、私はジェスチャーをクリックまたは保留/ドラッグイベントであるかどうかを検出するために、試してみたいと思いますので、私は最初のACTION_DOWNイベントにtrueを返すが、それは現在のジェスチャー最初にtrueを返した後にジェスチャーのonTouchEventsの受信を停止する方法

のためのより多くのイベントを処理するべきではありませんいくつかのミリ秒が経過するまで、私はタイムアウトし、ジェスチャーをクリックの代わりにホールド/ドラッグとして認識します。

タイムアウトが経過すると、falseをさらにonTouchEventsに戻して、イベントの受信を停止し、親ビューで残りのドラッグを管理できるようにしたいと思います。

しかし、私はあなたが最初のイベントのためにtrueを返したら、それは私が絶えず、後のイベントにfalseを返した後でも、関連するジェスチャーとすべてさらにイベントを受け取ることに気づくように見えます。戻り値は非常に最初のイベントにのみ重要であると思われますが、その後は無視されます。

onTouchEventの受信を停止する方法はありますか?それで、ジェスチャーで最初のイベントを受け入れたら、それを親に渡しますか?

答えて

2

ブール値の戻り値onTouchEventは、イベントが処理されたかどうかを示します。ユーザーがジェスチャーの途中でもイベントを受け取る必要があります。

一般的に、あなたはしかし、あなたのハンドラ内で必要な動作を調整することができます

private boolean hasHandledGesture = false; 

public boolean onTouchEvent(MotionEvent event){ 

    if(!hasHandledGesture){ 
     // Do your actual handling here for the first event 
     return true; 
    } else { 
     return super.onTouchEvent(event); 
    } 
} 

をしかし、私はあなたのケースであなたがsetOnLongClickListener経由で登録するハンドラを作成したほうが良いと思います。それはあなたの人生を楽にしてくれるだけでなく、長時間のプレスを作るのにどれくらい時間がかかるかOSに決定させるでしょう。これは、プレスの長さをシステムの残りの部分と一致させ、アプリ全体のネイティブなルック・アンド・フィールを助けたい場合に最適です。

さらに複雑なイベントをキャッチする場合は、GestureDetectorを使用して見たいかもしれませんが、長いプレスを検出しているだけの場合は、必要以上に複雑です。

+0

私の最初のコメントを削除しました。私は元々あなたの答えを誤解しました。私はあなたのコードサンプルが役に立たないかもしれないと思うが、longClickListenerを調べる。 falseを返すか、最初にtrueを返した後にsuper.onTouchEventを呼び出すと、元のonTouchEventからfalseを返しても、親ビューにはジェスチャの残りの部分が表示されません。 – Tim

+0

@Tim - この場合、GestureDetectorは必要なものと正確に一致する可能性があります。すべてのカスタム処理の前にイベントを検出器に渡すと、既存のハンドラだけを残して、長押しがトリガされたときにコールバックを受け取れるようにする必要があります。 – derekerdmann

+0

もちろん、私はGestureDetectorを調べます。 – Tim

関連する問題