AndroidViewPager禁止左滑(右滑)

因为项目需求,要做一个滑动月份选择的效果,而且滑动到当前月就要禁止左滑到下一个月,百度了下,大多是禁止左右双向滑动,满足不了效果,继续百度了解了下 触摸事件的分发,我决定自己写一个试试,结果效果很好。开始出现了一个bug,来回滑任然能左滑过去,结果发现是仅把按下时作为上一次坐标,来和当前坐标对比,肯定会有不满足的情况。这个问题已经解决了,直接看代码吧。

 

01. package com.example.xxx;
02.  
03. import android.content.Context;
04. import android.support.v4.view.ViewPager;
05. import android.util.AttributeSet;
06. import android.view.MotionEvent;
07.  
08. /**
09. * 可以设置禁止滑动的 ViewPager(单向禁止:左滑动)
10. *          核心方法:setScrollble()
11. * @author alan
12. *
13. */
14. public class CanotSlidingViewpager extends ViewPager {
15.  
16. /**
17. * 上一次x坐标
18. */
19. private float beforeX;
20.  
21.  
22.  
23. public CanotSlidingViewpager(Context context, AttributeSet attrs) {
24. super(context, attrs);
25. // TODO Auto-generated constructor stub
26. }
27.  
28. public CanotSlidingViewpager(Context context) {
29.  
30. super(context);
31. }
32.  
33. private boolean isCanScroll = true;
34.  
35. //----------禁止左右滑动------------------
36. //    @Override
37. //    public boolean onTouchEvent(MotionEvent ev) {
38. //        if (isCanScroll) {
39. //            return super.onTouchEvent(ev);
40. //        } else {
41. //            return false;
42. //        }
43. //
44. //    }
45. //
46. //    @Override
47. //    public boolean onInterceptTouchEvent(MotionEvent arg0) {
48. //        // TODO Auto-generated method stub
49. //        if (isCanScroll) {
50. //            return super.onInterceptTouchEvent(arg0);
51. //        } else {
52. //            return false;
53. //        }
54. //
55. //    }
56.  
57. //------------------------------------------- 
58.  
59.  
60. //-----禁止左滑-------左滑:上一次坐标 > 当前坐标
61. @Override
62. public boolean dispatchTouchEvent(MotionEvent ev) {
63. if(isCanScroll){
64. return super.dispatchTouchEvent(ev);
65. }else  {
66. switch (ev.getAction()) {
67. case MotionEvent.ACTION_DOWN://按下如果‘仅’作为‘上次坐标’,不妥,因为可能存在左滑,motionValue大于0的情况(来回滑,只要停止坐标在按下坐标的右边,左滑仍然能滑过去)
68. beforeX = ev.getX();
69. break;
70. case MotionEvent.ACTION_MOVE:
71. float motionValue = ev.getX() - beforeX;
72. if (motionValue < 0) {//禁止左滑
73. return true;
74. }
75. beforeX = ev.getX();//手指移动时,再把当前的坐标作为下一次的‘上次坐标’,解决上述问题
76.  
77. break;
78. default:
79. break;
80. }
81. return super.dispatchTouchEvent(ev);
82. }
83.  
84. }
85.  
86.  
87.  
88. public boolean isScrollble() {
89. return isCanScroll;
90. }
91. /**
92. * 设置 是否可以滑动
93. * @param isCanScroll
94. */
95. public void setScrollble(boolean isCanScroll) {
96. this.isCanScroll = isCanScroll;
97. }
98. }

 

右滑就把motionValue判断改成大于0

1. if (motionValue > 0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值