最近做一款电商APP频繁遇到过滑动冲突的问题,既在ViewPager的每一页里嵌套和ViewPager同滑动方向的ScrollView或RecyclerView,导致了很多恶心的问题,在此给自己做一个学习笔记,也和大家做一个交流。
垂直方向的判断
- public boolean canKeepSlidingForVertically(int direction) {
- final int offset = computeVerticalScrollOffset();
- final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
- if (range == 0) return false;
- if (direction < 0) {
- return offset > 0;
- } else {
- return offset < range - 1;
- }
水平方向的判断
- public boolean canKeepSlidingForHorizontally(int direction) {
- final int offset = computeHorizontalScrollOffset();
- final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
- if (range == 0) return false;
- if (direction < 0) {
- return offset > 0;
- } else {
- return offset < range - 1;
- }
- }
computeVerticalScrollOffset:计算控件垂直方向的偏移值,
computeVerticalScrollExtent:计算控件可视的区域,computeVerticalScrollRange:计算控件垂直方向的滚动范围
判断是否滑动到底部, canKeepSlidingForHorizontally(1);返回false表示不能往上滑动
判断是否滑动到顶部, canKeepSlidingForVertically(-1);返回false表示不能往下滑动
这个在ScrollView中也通用,具体可以在滑动分发事件dispatchTouchEvent触发事件进行判断,
while(!((viewParent = viewParent.getParent()) instanceof ViewPager)),这样获取到上层父类容器的Viewpager,调用对应方法判断是否到顶或底部,实现切换界面的逻辑即可,对事件传递机制不熟悉的可以去看下方文章,欢迎吐槽交流。
http://www.cnblogs.com/qifengshi/p/5826617.html
以上思路参考于 http://blog.csdn.net/msn465780/article/details/77101966
垂直方向的判断
- public boolean canKeepSlidingForVertically(int direction) {
- final int offset = computeVerticalScrollOffset();
- final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
- if (range == 0) return false;
- if (direction < 0) {
- return offset > 0;
- } else {
- return offset < range - 1;
- }