您的位置:首页 > 其它

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

2016-08-13 00:16 369 查看
我的布局比较复杂,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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: