1. 程式人生 > >解決ScrollView與ViewPager、ListView的滑動衝突

解決ScrollView與ViewPager、ListView的滑動衝突

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);
    }


    public 
CommonScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @SuppressLint("MissingSuperCall") @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); } }