Android-滑动冲突解决方案
2016-05-08 17:42
495 查看
假如ScrollView中嵌套一个ViewPager,
那么,在手势操作时会发现,ViewPager的左右滚动有时会失效,因为它的上级是一个可以上下滚动的ScrollView
这种情况我们称之为:滑动冲突
解法方案有二,一是外部拦截法,二是内部拦截法。
推荐使用外部拦截!内部拦截的灵敏度貌似不如外部拦截!
以下代码仅为模板,具体的拦截我略去了,读者可自行添加。
那么,在手势操作时会发现,ViewPager的左右滚动有时会失效,因为它的上级是一个可以上下滚动的ScrollView
这种情况我们称之为:滑动冲突
解法方案有二,一是外部拦截法,二是内部拦截法。
推荐使用外部拦截!内部拦截的灵敏度貌似不如外部拦截!
以下代码仅为模板,具体的拦截我略去了,读者可自行添加。
外部拦截法
package com.che.carcheck.ui.home; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ScrollView; /** * 外部拦截法 * <p> * 案例:ScrollView嵌套ViewPager * <p> * 作者:余天然 on 16/5/8 下午5:17 */ public class OuterScrollView extends ScrollView { public OuterScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean isIntercept = false; switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: isIntercept = false; break; case MotionEvent.ACTION_MOVE: isIntercept = canOuterIntercept(ev); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isIntercept = false; break; } return isIntercept; } /** * 自定义外部拦截手势的逻辑 * * @param ev * @return */ private boolean canOuterIntercept(MotionEvent ev) { return false; } }
内部拦截法
package com.che.carcheck.ui.home; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * 内部拦截法 * <p> * 案例:ScrollView嵌套ViewPager * <p> * 作者:余天然 on 16/5/8 下午5:27 */ public class InnerViewPager extends ViewPager { public InnerViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: if(canInnerIntercept(ev)){ //通知上级不要拦截手势 getParent().requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; } return super.dispatchTouchEvent(ev); } /** * 自定义内部拦截手势的逻辑 * * @param ev * @return */ private boolean canInnerIntercept(MotionEvent ev) { return false; } }
相关文章推荐
- Android之十一Toast 自定义Toast的实现方法,及其说明
- 【Android安全】使用jarsigner命令对apk进行重签名
- 【Android安全】使用apktool工具进行对apk反编译和回编
- Android Volley完全解析(一),初识Volley的基本用法
- 强制结束Android进程
- 【Android安全】使用dex2jar查看apk源码
- Android自定义视图四:定制onMeasure强制显示为方形
- android支付
- Android AHandle AMessage
- 5分钟搞定android混淆
- Android通用流行框架汇总
- Android自定义视图四:定制onMeasure强制显示为方形
- Android sdk update
- 【Android】ListView的单选、多选的实现
- Android设备使用扩展屏幕Presentation中的异常崩溃处理总结
- 手机号验证正则表达式
- Android开发命名规范和编码规范
- android studio adb
- Android酷炫的加载动画
- Android Button