4

FrameLayoutを拡張し、その上でスクロールイベントを通知する必要があるビューがあります。 このビューには、オーバーライドされたonInterceptTouchEventメソッドによって呼び出されるGestureDetectorを実装するクラスのインスタンスがあります。Android GestureDetectorはFrameLayoutでonScrollイベントを検出できません

private class HorizontalScrollListener implements OnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     ... 
     return false; 
    } 
    @Override 
    public boolean onDown(MotionEvent e) { 
     ... 
     return false; 
    } 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     return false; 
    } 
    @Override 
    public void onLongPress(MotionEvent e) { 
     ... 
     System.out.println(); 
    } 
    @Override 
    public void onShowPress(MotionEvent e) {} 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { return false; } 
} 

唯一の問題はonDownとonLongPress方法は、私がスクロールしてみてくださいwheen呼び出される可能性がありますが、実際のonScrollメソッドが呼び出されることは決してありませんということです。それはtrueを返したら

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    boolean result = super.onInterceptTouchEvent(event); 

    if (gestureDetector.onTouchEvent(event)) { 
     return result; 
    } else { 
     return false; 
    }  
} 
+0

あなたはonDown()からtrueを返そうとしましたか? – devconsole

+0

はい、それは決してonScroll(..)に届きません。 – Mahorad

+0

申し訳ありませんが、私のテストによると、onInceptceptTouchEventはすべてのタッチイベントを受け取るのではなく、最初のダウンイベントのみを返します。したがって、GestureDetectorはその作業を行うことができません。 (デバッグ出力をメソッドに追加してみてください。)公式の[documentation](http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29)によると、次のすべてのイベントを受け取るためにfalseを返すが、これは真実ではないようだ。 – devconsole

答えて

0

onInterceptTouchEventは、モーション・シーケンスのために再び呼び出されることはありません。イベントはすぐにonTouchEventに送信されます(現在は子から傍受されているため)。

  • OnGestureListener.onDown()ので、検出器は、スクロール
  • onInterceptTouchEventのようなより複雑なジェスチャーは、常にこの方法
  • に流れるイベントのストリームを維持するために falseを返す必要があります処理することができ trueを返す必要があります:あなたがここに二つの変更が必要

関連する問題