解決ScrollView與ViewPager、ListView的滑動衝突
阿新 • • 發佈:2019-01-29
public class CommonScrollView extends ScrollView { private float xLast,yLast,xDistance,yDistance; // ScrollView的子View, 也是ScrollView的唯一一個子View private View contentView; // 用於記錄正常的佈局位置 private Rect originalRect = new Rect(); public CommonScrollView(Context context) { super(context); } publicCommonScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @SuppressLint("MissingSuperCall") @Override protected void onFinishInflate() { if (getChildCount() > 0) { contentView = getChildAt(0); } } @Override protected voidonLayout(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); } }