私のために働きます。
私のために働きます。
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
私は最近同様の問題を解決し、あなたの助けになることを願っているアイデアを提供しました。
PhotoViewAttacher
のOnGestureListener
で、次のようにスライド角度の判断を増やします。
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
プロセスでの瞬間的な座標の変化を判断することです。 ページが複雑な場合は、カスタムRecyclerview
のdispatchTouchEvent
を上書きできます。 現在、私の側の効果はかなり良いです。 また、複数の画面で大きな画像(Widthのmatch_parentとHeightのwrap_content)のスムーズなスライドもサポートします。
最も参考になるコメント
私はそれを修正します、あなたはRecyclerViewをオーバーライドする必要があるだけです。
@ imyyq-star
パブリッククラスRecyclerViewViewPagerはRecyclerViewを拡張します{
}