解决ScrollView和VerticalViewPager滑动事件冲突问题
2015-06-20 15:45
706 查看
目前,看了下网上搜的大部分解决垂直的ViewPager和ScrollView的滑动事件冲突。
基本都是重写ScrollView, 解决当滑动水平距离小于垂直距离时,让viewpager切换pager。
我这里碰到的问题是,当ScrollView下滑,滑到到顶部时,VerticalViewPager应该被带动滑动。可是我的代码却没有。
我用的VerticalViewPager是: https://github.com/castorflex/VerticalViewPager
仔细看了他的VerticalViewPager,发现,在onInterceptTouchEvent事件里,应该可以写点儿什么,当ScrollView滑到顶部时,阻止Touch事件的分发。
于是在onInterceptTouchEvent方法里,添加了这段代码
上下文context需要在VerticalViewPager的构造方法里获取。
自定义的ScrollView代码如下。
一开始,设置那个firstPoint只是普通成员变量还不行,因为滑动scrollview到底部了,发现在VerticalViewPager里获取该变量,竟然为0.没找到原因,后来改成静态变量就好了。原因,待以后详究吧。
基本都是重写ScrollView, 解决当滑动水平距离小于垂直距离时,让viewpager切换pager。
我这里碰到的问题是,当ScrollView下滑,滑到到顶部时,VerticalViewPager应该被带动滑动。可是我的代码却没有。
我用的VerticalViewPager是: https://github.com/castorflex/VerticalViewPager
仔细看了他的VerticalViewPager,发现,在onInterceptTouchEvent事件里,应该可以写点儿什么,当ScrollView滑到顶部时,阻止Touch事件的分发。
于是在onInterceptTouchEvent方法里,添加了这段代码
if (dy != 0 && !isGutterDrag(mLastMotionY, dy) && canScroll(this, false, (int) dy, (int) x, (int) y)) { // Nested view has scrollable area under this point. Let it be handled there. mLastMotionX = x; mLastMotionY = y; mIsUnableToDrag = true; /////////////////////我添加的////////////////////////////////////////////////////////////////////////////// // 在MyScrollView 视图向下滑动时,继续传递事件, // 向上滑动时,判断如果MyScrollView滑到顶不了,就不在传递事件。 Activity act = (Activity)context; MyScrollView sv = (MyScrollView) act.findViewById(R.id.onlysv); float height = sv.getTopHeight(); MyLog.i("--tom", ",sv height:" + height + "dy" + dy ); if (sv.getTopHeight() > 0){ return false; } else { if(dy < 0){ MyLog.i("--tom", "dx < 0 viewpage interceptTouchEvent return false"); return false; } MyLog.i("--tom", "dx >= 0 viewpage interceptTouchEvent return true"); return true; } /////////////////////////////////////////////////////////////////////////////////////////////////////////// }
上下文context需要在VerticalViewPager的构造方法里获取。
自定义的ScrollView代码如下。
import com.mygame.pure.log.MyLog; 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; public class MyScrollView extends ScrollView { GestureDetector gestureDetector; View.OnTouchListener onTouchListener; public static float firstPoint; public float getTopHeight(){ return firstPoint; } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); // 添加了一个手势选择器 gestureDetector=new GestureDetector(new Yscroll()); setFadingEdgeLength(0); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: firstPoint = getScrollY(); MyLog.i("--tom", "getScrollY():" + firstPoint); break; default: break; } return super.onTouchEvent(ev); } public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub // return super.onInterceptTouchEvent(ev); boolean flags = super.onInterceptTouchEvent(ev) && gestureDetector.onTouchEvent(ev); // if(getScrollY() == 0){ // return false; // } MyLog.i("--tom", "MyScrollView:onInterceptTouchEvent" + flags); return flags; } class Yscroll extends SimpleOnGestureListener{ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //控制手指滑动的距离 if (Math.abs(distanceY)>=Math.abs(distanceX)) { return true; } return false; } } }
一开始,设置那个firstPoint只是普通成员变量还不行,因为滑动scrollview到底部了,发现在VerticalViewPager里获取该变量,竟然为0.没找到原因,后来改成静态变量就好了。原因,待以后详究吧。
相关文章推荐
- 局域网qq聊天室
- iptables之NAT基础
- 那年的夏天——致毕业
- android之存储篇——SQLite数据库
- WPF学习(一) - XAML
- IOS UINavigationController 操作相关集合
- 组合模式(Composite)
- HTML5系列二(标签元素、FileReader、拖放)
- 利用SQL语句查找姓“张”且分数大于80的记录(某公司招聘笔试试题)
- Xcode 6.3 免证书真机调试 已越狱
- Sphnix创建文档
- Path Sum
- 背景图片满屏显示
- iptables之iptables命令详解
- Hadoop 1.x 单机(本地)模式安装部署
- Geocoder模块编写
- 【Code】时间戳转换天时分秒字符串
- 欢迎使用CSDN-markdown编辑器
- Lua 与C/C++ 交互系列: Lua调用C/C++函数(2).
- SoapUI测试WebService