解決!Gallery中嵌套ListView,Gallery不能滑動的問題

直接代碼,請看註釋
/*
 * 引入相關類
 * */

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.Gallery;

/*
 * 繼承Gallery,重寫onInterceptTouchEvent(MotionEvent ev)方法
 * */

public class BetterGallery extends Gallery {

    private float mLastMotionX;//滑動過程當中,x方向的初始座標
    private float mLastMotionY;//滑動過程當中,y方向的初始座標
    private int mTouchSlop;//手指大小的距離

    /*
     * 三個構造函數
     * */

    public BetterGallery(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

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

    public BetterGallery(Context context) {
        super(context);
        init();
    }
    
    /*
     * 初始化,設置x方向移動的最小距離爲手指大小時,攔截處理事件,能夠設置須要的大小
     * */

    private void init() {
        final ViewConfiguration configuration = ViewConfiguration
                .get(getContext());
        mTouchSlop = configuration.getScaledTouchSlop();
    }
    
    /*
     * 重寫的方法,最關鍵的地方
     * */
    
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();//獲取觸摸事件類型
        final float x = ev.getX();//每次觸摸事件的x座標
        final float y = ev.getY();//每次觸摸事件的y座標
        switch (action) {
        case MotionEvent.ACTION_DOWN://按下事件
            mLastMotionX = x;//初始化每次觸摸事件的x方向的初始座標,即手指按下的x方向座標
            mLastMotionY = y;//初始化每次觸摸事件的y方向的初始座標,即手指按下的y方向座標
            break;

        case MotionEvent.ACTION_MOVE:
            final int deltaX = (int) (mLastMotionX - x);//每次滑動事件x方向座標與觸摸事件x方向初始座標的距離
            final int deltaY = (int) (mLastMotionY - y);//每次滑動事件y方向座標與觸摸事件y方向初始座標的距離
            boolean xMoved = Math.abs(deltaX) > mTouchSlop && Math.abs(deltaY/deltaX) < 1;
            //判斷觸摸事件處理的傳遞方向,該業務中是,
            //x方向的距離大於手指,而且y方向滑動的距離小於x方向的滑動距離時,Gallery消費掉這次觸摸事件
            //若是須要,請在您的業務中,改變判斷的邏輯
            if (xMoved) {//Gallery須要消費掉這次觸摸事件
                return true;//返回true就不會將這次觸摸事件傳遞給子View了,個人業務中是ListView
            }
            break;
        }
        return false;//將這次觸摸事件傳遞給子View,即ListView
    }
}
相關文章
相關標籤/搜索