ScrollView(Listview)和Viewpager(banner)的衝突解決辦法
阿新 • • 發佈:2018-11-05
原文地址:https://blog.csdn.net/qq_36255612/article/details/77987947
其實就是在onInterceptTouchEvent中做處理即可:
也可以直接使用下面的自定義:
public class MyScrollView extends ScrollView { private float xLast,yLast,xDistance,yDistance; // ScrollView的子View, 也是ScrollView的唯一一個子View private View contentView; // 用於記錄正常的佈局位置 private Rect originalRect = new Rect(); public MyScrollView(Context context) { super(context); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { if (getChildCount() > 0) { contentView = getChildAt(0); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (contentView == null) return; // ScrollView中的唯一子控制元件的位置資訊, 這個位置資訊在整個控制元件的生命週期中保持不變 originalRect.set(contentView.getLeft(), contentView.getTop(), contentView.getRight(), contentView.getBottom()); } /** * 在這裡解決滑動上下滑動,左右滑動衝突 * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { 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 (xDistance > yDistance) { return false; //表示向下傳遞事件 } } return super.onInterceptTouchEvent(ev); } }
ListView 同上