Android-スライド競合ソリューション

5268 ワード

ScrollViewにViewPagerがネストされている場合、ジェスチャー操作時に、ViewPagerの左右のスクロールが失効することがあります.上司が上下にスクロールできるScrollViewであるため、スライド衝突解法とは2つ、1つは外部ブロック法、2つは内部ブロック法です.
外部ブロックの使用を推奨します.内部ブロックの感度は外部ブロックに及ばないようです!
以下のコードはテンプレートのみで、具体的なブロックは省略しました.読者は自分で追加することができます.
がいぶブロックほう
package com.che.carcheck.ui.home;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

/** *       * <p> *   :ScrollView  ViewPager * <p> *   :    on 16/5/8   5:17 */
public class OuterScrollView extends ScrollView {

    public OuterScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean isIntercept = false;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isIntercept = false;
                break;
            case MotionEvent.ACTION_MOVE:
                isIntercept = canOuterIntercept(ev);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                isIntercept = false;
                break;
        }
        return isIntercept;
    }

    /** *              * * @param ev * @return */
    private boolean canOuterIntercept(MotionEvent ev) {
        return false;
    }
}

ないぶブロックほう
package com.che.carcheck.ui.home;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/** *       * <p> *   :ScrollView  ViewPager * <p> *   :    on 16/5/8   5:27 */
public class InnerViewPager extends ViewPager {
    public InnerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                if(canInnerIntercept(ev)){
                    //          
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    /** *              * * @param ev * @return */
    private boolean canInnerIntercept(MotionEvent ev) {
        return false;
    }
}