解决ViewPager滑动冲突解决方案之自定义ViewPager
2014-03-03 14:18
507 查看
由于ViewPager嵌套ViewPager很容易出现滑动冲突,下面的代码就实现局部的图片滑动,类似于新闻客户端的新闻消息滑动效果图功能。
为了大家能更好的理解,我们先来看下要实现的:
下面的代码除了考虑到局部滑动不冲突之外,还考虑了当滑动到第一张和最后一张的时候取消了对父ViewPager的滑动锁定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | public class ChildViewPager extends ViewPager { /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); OnSingleTouchListener onSingleTouchListener; public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public ChildViewPager(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // 当拦截触摸事件到达此位置的时候,返回true, // 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent return true; } @Override public boolean onTouchEvent(MotionEvent arg0) { int x, y; // 每次进行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现在进行的是本控件的操作,不要对我的操作进行干扰 x = (int)(curP.x - downP.x); y = (int)(curP.y - downP.y); int count = this.getAdapter().getCount()-1; if (Math.abs(x) > Math.abs(y)) { if (x > 0 && getCurrentItem() == 0) {// 第一页向左移动 getParent().requestDisallowInterceptTouchEvent(false); } else if (x < 0 && getCurrentItem() == count) {// getParent().requestDisallowInterceptTouchEvent(false); } else { getParent().requestDisallowInterceptTouchEvent(true); } }else if(Math.abs(x) < Math.abs(y)) { } } if (arg0.getAction() == MotionEvent.ACTION_UP) { // 在up时判断是否按下和松手的坐标为一个点 // 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick if (downP.x == curP.x && downP.y == curP.y) { onSingleTouch(); return true; } } if (arg0.getAction() == MotionEvent.ACTION_CANCEL) { getParent().requestDisallowInterceptTouchEvent(false); } 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; } } |
相关文章推荐
- ActivityGroup、TabHost之子页面不刷新——getLocalActivityManager() 以及intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法
- 一个JavaScript工程师必须掌握的几个方面
- 升级php 5.2.14 到5.4.11版本报错问题
- how to get device node name such as /dev/ttyS1.
- Exchange 2013 SP1发布
- 浏览器厂商“捞过界”,其实暴露了网络广告三大“贱”
- usaco training 4.4.3 Frame Up 题解
- 提示磁盘被写保护怎么办?
- Spring与RMI整合
- 都是static惹的祸
- 指定oozie java节点的hadoop属性
- UML图--类图
- Oracle 存储过程
- Unity-Android: Can't create handler inside thread that has not called Looper.prepare()
- SVN(备忘)
- 关于计划任务运行失败。
- Android给TextView设置透明背景、圆角边框
- ^(bitwise exclusive Or).
- WebService体系之——HelloWorld搭建
- maven的pom.xml文件详解