Android touch冲突解决小记

1.ScrollView嵌套ViewPager
ViewPager横向滑动的时候容易变成上下滑动,感觉体验不好,重写ViewPager的onTouchEvent事件,当ViewPager横向滚动的距离大于纵向距离时,设置父容器不拦截滚动事件getParent().requestDisallowInterceptTouchEvent(true);
MyViewPager.java源码

public class MyViewPager extends ViewPager{

    // 常量区块=============================================================

    // 变量区块=============================================================
    private boolean isDealTouchEvent = true;
    private float point_down_x;
    private float point_down_y;

    // 构造函数区块===========================================================
    public MyViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    // 方法区块===========================================================
    public void setDealTouchEvent(boolean is) {
        isDealTouchEvent = is;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        float point_x = ev.getX();
        float point_y = ev.getY();
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            point_down_x = point_x;
            point_down_y = point_y;
            break;
        case MotionEvent.ACTION_MOVE:
            if (isDealTouchEvent) {
                if (Math.abs(point_x - point_down_x) > Math.abs(point_y - point_down_y)) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            break;

        default:
            break;
        }
        return super.onTouchEvent(ev);
    }

    // 内部接口(类)区块========================================================

}

2.ScrollView嵌套ListView
第一个问题是ListView大小的问题,设置固定大小或者动态测量都可以,如果设置的高度小于ListView的全部高度并且希望ListView能够滚动,就需要知道ListView滚动到顶和到底的事件,然后在未到顶或者到底的时候设置父容器不屏蔽滑动事件。
MyListView.java 源码

public class MyListView extends ListView {

    // 常量区块=============================================================

    // 变量区块=============================================================
    private boolean isDealTouchEvent = true;

    // 构造函数区块===========================================================
    public MyListView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    // 方法区块===========================================================
    public void setDealTouchEvent(boolean is) {
        isDealTouchEvent = is;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (isDealTouchEvent) {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
            break;

        default:
            break;
        }
        return super.onTouchEvent(ev);
    }


    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,
            boolean clampedY) {
        // TODO Auto-generated method stub
        if (isDealTouchEvent) {
            if (scrollX == 0 && scrollY == 0) {
                /*if (getFirstVisiblePosition() == 0) { // 到顶

                } else { // 到底

                }*/
                getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
    }

    // 内部接口(类)区块========================================================

}

附件Demo地址:ScrollView嵌套ViewPager和ListView
ScrollView嵌套ViewPager,ViewPager横向滑动时容易上下滚动处理; ScrollView嵌套ListView,ListView滚动事件处理,可滚动;
ScrollView子控件获取焦点后自动置顶问题处理。
ListView滚动到顶或到底事件监听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值