ScrollView中嵌入ViewPager,ViewPager的滑动出现问题

tgyhrfuj741 2012-09-14 04:47:05
在滑动ViewPager进行切换时,必须完全保持水平的滑动。如若进行滑动的时候滑动方向发生了倾斜,就会触发ScrollView的滚动事件,而ViewPager的滑动也会终止并变回原来的样子。

怎样才能让在ViewPager进行滑动时ScrollView不滚动。

试过重写ScrollView的onTouchEvent,但是没有效果。
...全文
11852 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
adayabetter 2015-04-07
  • 打赏
  • 举报
回复
确实,楼主的解决办法有些缺陷,应该这样复写ScrollView
package com.moretv.activity.newActivity.special;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView {
	private float xDistance, yDistance, xLast, yLast;
	public MyScrollView(Context context) {
		super(context);
	}
    public MyScrollView(Context context,AttributeSet attrs){
    	super(context, attrs);
    }
    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
    	super(context, attrs, defStyle);
    }
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
		xDistance = yDistance = 0f;
		xLast = ev.getX();
		yLast = ev.getY();
		break;
		case MotionEvent.ACTION_MOVE:
		final float curX = ev.getX();
		final float curY = ev.getY();

		xDistance += Math.abs(curX - xLast);
		yDistance += Math.abs(curY - yLast);
		xLast = curX;
		yLast = curY;

		if (xDistance > yDistance) {
		return false;
		}
		}
		return super.onInterceptTouchEvent(ev);
	}
}
qq343913906 2014-10-27
  • 打赏
  • 举报
回复
顶! 真有用!!!
s2221219 2014-08-23
  • 打赏
  • 举报
回复
NB 顶一个 好东西应该让大家都看到
爱琦琦 2014-08-14
  • 打赏
  • 举报
回复
膜拜大神。。。Orz...帮助我我解决了困扰多年的便秘
qq_18150347 2014-07-31
  • 打赏
  • 举报
回复
顶一个先!!!!!!!!!!!!!
Apathy_heng 2014-07-22
  • 打赏
  • 举报
回复
楼主重写的scrollview是有问题的,会经常出现scrollview无法滑动的问题,完全不能用,下面提供一个可以网上查找可以正常使用的自定义scrollview代码: public class CustomScrollView extends ScrollView { private float xDistance, yDistance, xLast, yLast; public CustomScrollView(Context context) { super(context); } public CustomScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (xDistance > yDistance) { return false; } } return super.onInterceptTouchEvent(ev); } }
yangtao_1 2014-07-20
  • 打赏
  • 举报
回复
大神NB。。。
xun-ming 2014-07-16
  • 打赏
  • 举报
回复
多谢,重写了scrollview和viewpager就好了
ax003d 2014-03-03
  • 打赏
  • 举报
回复
多谢楼主!我在一个 ScrollView 里嵌入了一个 ViewPager,使用楼主的方法重写了 ViewPager,让它只能横向滚动不能纵向滚动。
和平跑者 2013-12-25
  • 打赏
  • 举报
回复
各位大哥,能发一个demo吗? 我试过了自定义ScrollView还是不行。
Lzd0lzd 2013-12-12
  • 打赏
  • 举报
回复
顶!!!必须顶!!!!
xushenghe0 2013-12-11
  • 打赏
  • 举报
回复
回忆往事20_13 2013-12-07
  • 打赏
  • 举报
回复
大神怎么调用scrollview1啊,我调用报错:自定义scrollview1不能强制转换为Scrollview
JackyBower 2013-11-12
  • 打赏
  • 举报
回复
非常不错,用2楼的方法解决了,3Q
卿本佳人608 2013-10-28
  • 打赏
  • 举报
回复
不错,用2楼的方法解决了问题!顶一个,我的是在ScrollView里面嵌入ViewPager,当ViewPager左右滑动的时候,如果滑偏ScrollView会上下滑动。用了2楼的方法之后,ViewPager左右滑动的时候滑动方向发生了倾斜,ScrollView的滚动事件不会触发。大神,顶顶顶顶顶顶顶顶顶顶顶!!!!!!!
tanggod 2013-10-14
  • 打赏
  • 举报
回复
为什么要private boolean canScroll;这个东西啊? 这段代码存在问题: 我发现,如果ScrollView1里面包含多个LinearLayout的,例如A, B, C, 如果第一次在A上面划,下一次在LayoutB上面划,在B上面是划不动的,第二次在B上面才能划动。 后来我删除canScroll相关的代码,就都没有问题了。
引用 2 楼 tgyhrfuj741 的回复:
已经自己实现了,需要重写ScrollView,下面是代码

package com.zp365.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;

/**
 * 解决ScrollView嵌套ViewPager出现的滑动冲突问题
 */
public class ScrollView1 extends ScrollView {
	private boolean canScroll;

	private GestureDetector mGestureDetector;
	View.OnTouchListener mGestureListener;

	public ScrollView1(Context context, AttributeSet attrs) {
		super(context, attrs);
		mGestureDetector = new GestureDetector(new YScrollDetector());
		canScroll = true;
	}
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		if(ev.getAction() == MotionEvent.ACTION_UP)
			canScroll = true;
		return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
	}

	class YScrollDetector extends SimpleOnGestureListener {
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
			if(canScroll)
				if (Math.abs(distanceY) >= Math.abs(distanceX))
					canScroll = true;
				else
					canScroll = false;
			return canScroll;
		}
	}
}
用这个自定义的ScrollView代替原来的ScrollView就行
sunqimin 2013-09-18
  • 打赏
  • 举报
回复
++++++++ 不错哦。。。
Faith_hb 2013-09-18
  • 打赏
  • 举报
回复
用2#的办法 解决问题 谢谢!!!
  • 打赏
  • 举报
回复
这样方法在哪里调用,求大神指教
jjyy361277629 2013-08-18
  • 打赏
  • 举报
回复
在scrollview中放一个viewpager,然后在viewpager里面放listview,展示不出数据是怎么回事啊,求大神指教。
加载更多回复(7)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧