viewpager+fragment+viewpager+scrollview滑动冲突问题

我的布局比较复杂,viewpager里面是fragment,fragment里面有事viewpager,viewpager里面有事fragment,fragment里面是scrollview,scrollview里面是viewpager和listview不要问我为什么这么复杂,想想就蛋疼。。。
在这里面能滑动的有viewpager和scrollview,那么当我们滑动的时候到底哪个滑动,这是个问题,这里解决的是里层viewpager滑动时,外层viewpager和scrollview不滑动(其实scrollview影响不大,但是不禁止的话,viewpager左右滑动的时候稍微有一点上下动,就会出发scrollview的滑动,从而viewpager的左右滑动就失败啦。所以把scrollview也禁止啦),解决办法就是自定义一个viewpager
代码如下:

package com.mydrivernews.tools;

import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;

public class ImageViewPager extends ViewPager {

    public ImageViewPager(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public ImageViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    PointF downPoint = new PointF();
    OnSingleTouchListener onSingleTouchListener;

    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        /**
        *这里是我的布局结构,每次getParent()就得到他外边的布局,scrollview或viwepager和这个viewpager直接有几层布局,就用几个getParent()
        **/
        ViewParent p=getParent().getParent().getParent();
        //外层的viewpager取消拦截
        ViewParent p2=getParent().getParent().getParent().getParent().getParent();

        switch (evt.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 记录按下时候的坐标
            downPoint.x = evt.getX();
            downPoint.y = evt.getY();
            if (this.getChildCount() > 1) { // 有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                p.requestDisallowInterceptTouchEvent(true);
                p2.requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (this.getChildCount() > 1) { // 有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                p.requestDisallowInterceptTouchEvent(true);
                p2.requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_UP:
            // 在up时判断是否按下和松手的坐标为一个点
            if (PointF.length(evt.getX() - downPoint.x, evt.getY() - downPoint.y) < (float) 5.0) {
                onSingleTouch(this);
                return true;
            }
            break;
        }
        return super.onTouchEvent(evt);
    }

    public void onSingleTouch(View v) {
        if (onSingleTouchListener != null) {
            onSingleTouchListener.onSingleTouch(v);
        }
    }

    public interface OnSingleTouchListener {
        public void onSingleTouch(View v);
    }

    public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值