1

この同じ質問に対していくつかの異なる回答を読んだので、どれが正しいのかわかりません。もう一度質問することにしました。この回答で他のリンクを参照しないようにしてください。そうしたい場合は、少し追加の説明を期待します。

私の質問は次のとおりです。ImageView内部に がありViewPagerImageViewいくつかのジェスチャ検出 (ズームとパン) があり、デフォルトViewPagerでスワイプ検出がある default を使用しています。 onTouch イベントのチェーンはどのように機能しますか? 階層の最下位のビューは常に onTouch を取得し、メソッドが false を返した場合、親はそれを処理しますか? もしかして逆?

ImageView左右にジェスチャがある があり、画像の端に入るとViewPager、ページネーションイベントを処理するために親 ( a ) にイベントをディスパッチする必要があるため、私はそれを求めています。それを行う方法についてさらにヒントがあれば、本当に感謝します。

4

2 に答える 2

2

だから、私はViewPagerの子ビューでの複数のタッチをonInterceptTouchEventよりも良い方法で管理しました。私の場合、Pagerではなく子ビューをスクロールする必要があるかどうかを知るために、始点と終点の間の距離であり、その変数を保持して後でデルタを計算したくありませんでした。

とにかく、ViewPagerのソースコードを調べたところ、この理由で実装する必要のある本当に良いメソッドがあることがわかりました。これが私の実装です:

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v instanceof ImageViewTouch) {
        return ((ImageViewTouch) v).canScroll(dx);
    } else {
        return super.canScroll(v, checkV, dx, x, y);
    }
}

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java#ViewPager.canScroll%28android。 view.View%2Cboolean%2Cint%2Cint%2Cint%29

于 2012-06-26T19:10:57.893 に答える
1

反対に、ViewPager が最初にタッチ イベントを食べ、次に ImageView がそれを取得します。

カスタム ビュー ページャーで onInterceptTouchEvent(MotionEvent ev) を使用します。MotionEvent では、ev.getPointerCount() によってタッチ ポイントがいくつあるかを分析する必要があります。

ev.getPointerCount() == 2 の場合、おそらく ImageView 内でピンチ アンド ズームを実行したいと思うでしょう。

ev.getPointerCount() == 1 の場合は、View Pager のページをスワイプするか、ImageView でパンを実行しようとしている可能性があります。これらの 2 つを区別するために、スワイプ ジェスチャを 1 本の指で実行しているか、単純な MotionEvent.MOVE でパンを実行しているかを把握する必要があります。スワイプ ジェスチャでは、ユーザーは事前定義された速度を超える必要があります。GestureDetector がこれを処理します。

于 2012-06-25T20:56:43.207 に答える