RecyclerView嵌套viewpager


需求:
RecyclerView中的一個item是viewpager,這樣的嵌套,預知會有坑要踩,MD,果不其然,啪啪,兩個大餅甩了過來:

(1)viewpager在左右滑動時,再進行上下的手勢會觸發RecyclerView的上下滾動,解決它;
(2)viewpager在緩慢的左右滑動時,需要一段比較長的距離,需要縮短!(wtf,系統就是這樣設計的好嗎!?)

public class FixBugViewpager extends ViewPager { private Context mContext; public FixBugViewpager(Context context) { super(context); this.mContext = context; fixTouchSlop(); } public FixBugViewpager(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; fixTouchSlop(); } /** *這個方法是通過反射,修改viewpager的觸發切換的最小滑動速度(還是距離?姑 * 且是速度吧!滑了10dp就給它切換) **/ private void fixTouchSlop() { Field field = null; try { field = ViewPager.class.getDeclaredField("mMinimumVelocity"); } catch (NoSuchFieldException e) { e.printStackTrace(); } field.setAccessible(true); try { field.setInt(this, Screen.px2dip(mContext, 10)); } catch (IllegalAccessException e) { e.printStackTrace(); } } /**** * 滑動距離及坐標 歸還父控件焦點 ****/ private float xDistance, yDistance, xLast, yLast; /** * 是否是左右滑動 **/ private boolean mIsBeingDragged = true; /** *重寫這個方法純屬是為了告訴Recyclerview,什么時候不要攔截viewpager的滑動 *事件 **/ @Override public boolean dispatchTouchEvent(MotionEvent ev) { getParent().requestDisallowInterceptTouchEvent(true); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (!mIsBeingDragged) { if (yDistance < xDistance * 0.5) {//小於30度都左右滑 mIsBeingDragged = true; getParent().requestDisallowInterceptTouchEvent(true); } else { mIsBeingDragged = false; getParent().requestDisallowInterceptTouchEvent(false); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mIsBeingDragged = false; break; } return super.dispatchTouchEvent(ev); }}

如果我一不小心解決了你的問題,請贊助我買個頸椎康復機吧!



作者:eveo
鏈接:https://www.jianshu.com/p/b49bc86e1014
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM