android嵌套使用ViewPager和ScrollView焦点冲突解决方案
2015-07-21 16:58
603 查看
在ScrollView中嵌套ViewPager做图片预览,发现滑动ViewPager中的图片会出现,无法滑动到下一页。
原因分析:
ViewPager滑动的时候,焦点与ScrollView的滑动焦点冲突了。
解决方案:
重写ViewPager或者ScrollView中的焦点处理事件;
方案1:重写ScrollView:
方案2:重写ViewPager
原因分析:
ViewPager滑动的时候,焦点与ScrollView的滑动焦点冲突了。
解决方案:
重写ViewPager或者ScrollView中的焦点处理事件;
方案1:重写ScrollView:
package com.mi.view.widget; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ScrollView; /** * 能够兼容ViewPager的ScrollView * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题 */ 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); } }
方案2:重写ViewPager
public class ViewPagerExtend extends ViewPager{ /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); OnSingleTouchListener onSingleTouchListener; public ViewPagerExtend(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public ViewPagerExtend(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; } }
相关文章推荐
- android键盘锁定问题
- 使用Gradle提交自己开源Android库到Maven中心库
- Android入门实战AS重制版
- Android 事件分发总结
- Android学习之BaseAdapter
- Android 手势锁的实现 让自己的应用更加安全吧
- Android导出APK包时出现,编译调试时不会出现。
- Android ContentProvider+ContentObserver
- android加载长图片出现Bitmap too large to be uploaded into a texture的解决方案
- android代码审查工具---lint工具的使用
- Android 自定义ratingBar(评分小星星)的使用
- Android项目所遇问题
- Android读取手机联系人信息
- android 中共享变量SharedPreferences的使用
- Android 组件系列之Activity的传值和回传值
- 启动、运行超快的Android模拟器 genymotion
- Android从服务端获取json解析显示在客户端上面
- Android动态加载jar、apk的实现
- android整理的一些基础知识
- Android招财进宝手势密码的实现