最近做的有个项目,主要是轮播图这部分,RefreshScrollviewLayout下嵌套viewpager ,在滑动轮播图的时候,发现如果横向滑动稍微有点斜的话,就会触动RefreshScrollviewLayout的下拉刷新。这肯定是事件传递的问题,
http://blog.csdn.net/gdutxiaoxu/article/details/52939127
http://www.2cto.com/kf/201705/637673.html
通过这两篇文章解决的问题:
重写SwipeRefreshLayout(出于google):
import
android.content.Context;
import
android.support.v4.widget.SwipeRefreshLayout;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.ViewConfiguration;
/**
* Created by admin on 2017/5/5.
*/
public
class
MySwipeRefreshLayout
extends
SwipeRefreshLayout {
private
float
startY;
private
float
startX;
// 记录viewPager是否拖拽的标记
private
boolean
mIsVpDragger;
private
final
int
mTouchSlop;
public
MySwipeRefreshLayout(Context context, AttributeSet attrs) {
super
(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public
boolean
onInterceptTouchEvent(MotionEvent ev) {
int
action = ev.getAction();
switch
(action) {
case
MotionEvent.ACTION_DOWN:
// 记录手指按下的位置
startY = ev.getY();
startX = ev.getX();
// 初始化标记
mIsVpDragger =
false
;
break
;
case
MotionEvent.ACTION_MOVE:
// 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;
if
(mIsVpDragger) {
return
false
;
}
// 获取当前手指位置
float
endY = ev.getY();
float
endX = ev.getX();
float
distanceX = Math.abs(endX - startX);
float
distanceY = Math.abs(endY - startY);
// 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
if
(distanceX > mTouchSlop && distanceX > distanceY) {
mIsVpDragger =
true
;
return
false
;
}
break
;
case
MotionEvent.ACTION_UP:
case
MotionEvent.ACTION_CANCEL:
// 初始化标记
mIsVpDragger =
false
;
break
;
}
// 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
return
super
.onInterceptTouchEvent(ev);
}
}
重写ScrollView(出于google):
import
android.content.Context;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.widget.ScrollView;
/**
* Created by admin on 2017/5/5.
*/
public
class
VerticalScrollView
extends
ScrollView {
private
float
xDistance, yDistance, lastX, lastY;
public
VerticalScrollView(Context context, AttributeSet attrs) {
super
(context, attrs);
}
@Override
public
boolean
onInterceptTouchEvent(MotionEvent ev) {
switch
(ev.getAction()) {
case
MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
lastX = ev.getX();
lastY = ev.getY();
break
;
case
MotionEvent.ACTION_MOVE:
final
float
curX = ev.getX();
final
float
curY = ev.getY();
xDistance += Math.abs(curX - lastX);
yDistance += Math.abs(curY - lastY);
lastX = curX;
lastY = curY;
if
(xDistance > yDistance)
return
false
;
}
return
super
.onInterceptTouchEvent(ev);
}
}