直接代碼,請看註釋
/*
* 引入相關類
* */
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
}
}