您的位置:首页 > 其它

解决ViewPager滑动冲突解决方案之自定义ViewPager

2014-03-03 14:18 507 查看



作者:general发布于 10月22日访问(1354)评论(4

由于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;
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: