Photoview: RecyclerView + PagerSnapHelperをサポートします

作成日 2018年09月14日  ·  7コメント  ·  ソース: Baseflow/PhotoView

最も参考になるコメント

私はそれを修正します、あなたはRecyclerViewをオーバーライドする必要があるだけです。
@ imyyq-star

パブリッククラスRecyclerViewViewPagerはRecyclerViewを拡張します{

private ScaleGestureDetector gestureDetector;

/**
 * 标记位  isScaleing 是否正在缩放,hasMorePointers 是否多个手指在屏幕上
 */
private boolean isScaleing,hasMorePointers;

public RecyclerViewViewPager(Context context) {
    super(context);
    init(context);
}

public RecyclerViewViewPager(Context context, <strong i="8">@Nullable</strong> AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public RecyclerViewViewPager(Context context, <strong i="9">@Nullable</strong> AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    gestureDetector = new ScaleGestureDetector(context,new GestureListener());
}

class GestureListener implements ScaleGestureDetector.OnScaleGestureListener{

    <strong i="10">@Override</strong>
    public boolean onScale(ScaleGestureDetector detector) {
        isScaleing = true;
        return false;
    }

    <strong i="11">@Override</strong>
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        return false;
    }

    <strong i="12">@Override</strong>
    public void onScaleEnd(ScaleGestureDetector detector) {
        isScaleing = false;
    }
}


<strong i="13">@Override</strong>
public boolean dispatchTouchEvent(MotionEvent ev) {
    gestureDetector.onTouchEvent(ev);
    if (ev.getPointerCount() > 1) {
        hasMorePointers = true;
    }else {
        hasMorePointers= false;
    }
    return super.dispatchTouchEvent(ev);
}

<strong i="14">@Override</strong>
public boolean onInterceptTouchEvent(MotionEvent e) {
    if (isScaleing || hasMorePointers){
        return false;
    }
    return super.onInterceptTouchEvent(e);
}

}

全てのコメント7件

私のために働きます。

私のために働きます。

RecyclerView + PagerSnapHelperは拡大縮小できますが、十分にスムーズではなく、多くの場合、次のページにスライドします

画像リストの子を追加および削除する必要があります。
ただし、ViewPagerの追加と削除はあまりにも不親切です。

RecyclerView + PagerSnapHelperは拡大縮小できますが、十分にスムーズではなく、多くの場合、次のページにスライドします
私は同じ質問があります、あなたはそれを解決しましたか? @ imyyq-star

私はそれを修正します、あなたはRecyclerViewをオーバーライドする必要があるだけです。
@ imyyq-star

パブリッククラスRecyclerViewViewPagerはRecyclerViewを拡張します{

private ScaleGestureDetector gestureDetector;

/**
 * 标记位  isScaleing 是否正在缩放,hasMorePointers 是否多个手指在屏幕上
 */
private boolean isScaleing,hasMorePointers;

public RecyclerViewViewPager(Context context) {
    super(context);
    init(context);
}

public RecyclerViewViewPager(Context context, <strong i="8">@Nullable</strong> AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public RecyclerViewViewPager(Context context, <strong i="9">@Nullable</strong> AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

private void init(Context context) {
    gestureDetector = new ScaleGestureDetector(context,new GestureListener());
}

class GestureListener implements ScaleGestureDetector.OnScaleGestureListener{

    <strong i="10">@Override</strong>
    public boolean onScale(ScaleGestureDetector detector) {
        isScaleing = true;
        return false;
    }

    <strong i="11">@Override</strong>
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        return false;
    }

    <strong i="12">@Override</strong>
    public void onScaleEnd(ScaleGestureDetector detector) {
        isScaleing = false;
    }
}


<strong i="13">@Override</strong>
public boolean dispatchTouchEvent(MotionEvent ev) {
    gestureDetector.onTouchEvent(ev);
    if (ev.getPointerCount() > 1) {
        hasMorePointers = true;
    }else {
        hasMorePointers= false;
    }
    return super.dispatchTouchEvent(ev);
}

<strong i="14">@Override</strong>
public boolean onInterceptTouchEvent(MotionEvent e) {
    if (isScaleing || hasMorePointers){
        return false;
    }
    return super.onInterceptTouchEvent(e);
}

}

@walkingCoder

それでも完璧ではありません。最初に2本の指でズームしてから、1本の指を離すと、次の指に簡単にスライドできます。

@ imyyq-star

私は最近同様の問題を解決し、あなたの助けになることを願っているアイデアを提供しました。
PhotoViewAttacherOnGestureListenerで、次のようにスライド角度の判断を増やします。

if (mHorizontalScrollEdge == HORIZONTAL_EDGE_BOTH
                        || (mHorizontalScrollEdge == HORIZONTAL_EDGE_LEFT && dx >= 1f)
                        || (mHorizontalScrollEdge == HORIZONTAL_EDGE_RIGHT && dx <= -1f)
                        || (mVerticalScrollEdge == VERTICAL_EDGE_TOP && dy >= 1f)
                        || (mVerticalScrollEdge == VERTICAL_EDGE_BOTTOM && dy <= -1f)) {
                    //add the line below
                    if (Math.abs(dx) >= 10f && Math.abs(dx) > Math.abs(dy)) {
                        if (parent != null) {
                            parent.requestDisallowInterceptTouchEvent(false);
                        }
                    }
                }

アイデアは、 moveプロセスでの瞬間的な座標の変化を判断することです。 ページが複雑な場合は、カスタムRecyclerviewdispatchTouchEventを上書きできます。 現在、私の側の効果はかなり良いです。 また、複数の画面で大きな画像(Widthのmatch_parentとHeightのwrap_content)のスムーズなスライドもサポートします。

このページは役に立ちましたか?
0 / 5 - 0 評価