因为项目需求,要做一个滑动月份选择的效果,而且滑动到当前月就要禁止左滑到下一个月,百度了下,大多是禁止左右双向滑动,满足不了效果,继续百度了解了下 触摸事件的分发,我决定自己写一个试试,结果效果很好。开始出现了一个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
)