问题描述
当在SwipeRefreshLayout内嵌ViewPager时,出现ViewPager横向滑动不畅,很难滑.
解决方案
自定义SwipeRefreshLayout,重写onInterceptTouchEvent函数.
根据下滑的角度来判断是否让SwipeRefreshLayout处理事件,还是让子控件来处理.
class VpSwipeRefreshLayout(context: Context, attrs: AttributeSet) : SwipeRefreshLayout(context, attrs) {
private var startY: Float = 0.toFloat()
private var startX: Float = 0.toFloat()
/**
* 记录viewPager是否正处于拖拽的标记
*/
private var mIsVpInDrag: Boolean = false
private val mTouchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
// 记录手指按下的位置
startY = ev.y
startX = ev.x
// 初始化标记
mIsVpInDrag = false
}
MotionEvent.ACTION_MOVE -> {
// 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;
if (mIsVpInDrag) {
return false
}
// 获取当前手指位置
val endY = ev.y
val endX = ev.x
val distanceX = abs(endX - startX)
val distanceY = abs(endY - startY)
// 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
if (distanceX > mTouchSlop && distanceX > distanceY) {
mIsVpInDrag = true
return false
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL ->
// 初始化标记
mIsVpInDrag = false
}
// 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
return super.onInterceptTouchEvent(ev)
}
}
网友评论