ScrollView嵌套ViewPager引起的滑动冲突的解决方案
来源:互联网 发布:李彦宏 知乎 编辑:程序博客网 时间:2024/06/05 09:43
导读:ScrollView嵌套ViewPager引起的滑动冲突,原因是S从rollView和ViewPager都有滑动的效果,当我们发生滑动这个动作时,系统不知道 要交给那个控件来处理滑动操作,故出现了冲突。
知道了原理,我们要做的就是
1.给最先捕获事件的View一些参数,让其根据参数做比较,然后判断出Motion到底要交给谁来处理。关键点:判断x方向与y方向移动距离大小的比较,从而判断是ViewPager还是ScrollView的滑动。
或者
2.我们直接手动操作代码告诉让哪个控件来处理Motion
因此解决方案会有两种,下面就让我们一起来看看吧~~~~~~~~
方案一:
自定义ViewPager作为子控件
public class ChildViewPager extends ViewPager{
/** 触摸时按下的点 **/
PointF downP = new PointF();
/** 触摸时当前的点 **/
PointF curP = new PointF();
OnSingleTouchListener onSingleTouchListener;
public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ChildViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
//当拦截触摸事件到达此位置的时候,返回true,
//说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
return true;
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
//每次进行onTouch事件都记录当前的按下的坐标
curP.x = arg0.getX();
curP.y = arg0.getY();
if(arg0.getAction() == MotionEvent.ACTION_DOWN){
//记录按下时候的坐标
//切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
downP.x = arg0.getX();
downP.y = arg0.getY();
//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_MOVE){
//此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
getParent().requestDisallowInterceptTouchEvent(true);
}
if(arg0.getAction() == MotionEvent.ACTION_UP){
//在up时判断是否按下和松手的坐标为一个点
//如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
if(downP.x==curP.x && downP.y==curP.y){
onSingleTouch();
return true;
}
}
return super.onTouchEvent(arg0);
}
/**
* 单击
*/
public void onSingleTouch() {
if (onSingleTouchListener!= null) {
onSingleTouchListener.onSingleTouch();
}
}
/**
* 创建点击事件接口
* @author wanpg
*
*/
public interface OnSingleTouchListener {
public void onSingleTouch();
}
public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {
this.onSingleTouchListener = onSingleTouchListener;
}
}
方案二:
/**
* 能够兼容ViewPager的ScrollView
* @Description: 解决了ViewPager在ScrollView中的滑动反弹问题
* @File: ScrollViewExtend.java
* @Package com.image.indicator.control
* @Author Hanyonglu
* @Date 2012-6-18 下午01:34:50
* @Version V1.0
*/
public class ScrollViewExtend extends ScrollView {
// 滑动距离及坐标
private float xDistance, yDistance, xLast, yLast;
public ScrollViewExtend(Context context, AttributeSet attrs) {
super(context, attrs);
}
@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);
}
}
- ScrollView嵌套ViewPager引起的滑动冲突的解决方案
- scrollview 嵌套 viewpager 滑动冲突的解决办法
- ScrollView嵌套ViewPager滑动冲突的解决
- ScrollView嵌套ViewPager滑动冲突的问题
- ScrollView ViewPager嵌套导致滑动冲突解决方案
- ScrollView ViewPager嵌套导致滑动冲突解决方案
- ScrollView ViewPager嵌套导致滑动冲突解决方案
- ScrollView ViewPager嵌套导致滑动冲突解决方案
- ScrollView ViewPager嵌套导致滑动冲突解决方案
- ScrollView嵌套ListView滑动冲突的解决方案
- 解决嵌套viewpager滑动冲突的解决方案
- ScrollView嵌套Scrollview中滑动时间冲突的解决方案
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- Viewpager嵌套ScrollView和ListView嵌套ScrollView引起的冲突问题
- scrollview嵌套viewpager 滑动冲突
- Android 开发中scrollview嵌套webview滑动冲突的解决方案
- Android scrollview嵌套webview滑动冲突的解决方案
- 小心Java中封装类的值比较
- SAP客户端显示异常问题
- 关于fragment和Loaders
- linux的文件权限控制
- oracle、子句实现递归查询
- ScrollView嵌套ViewPager引起的滑动冲突的解决方案
- 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器
- Makefile总结
- JavaScript学习笔记1
- JAVA:值传递和引用传递
- 暑期”7-11“计划
- 案例分析:基于消息的分布式架构
- 终端和Shell
- 用户级线程和内核级线程