解决!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
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值