淘宝客网站建设分类,手机网页设计尺寸规范,如何注册公司网站域名,dw制作个人网页代码问题描述
场景ViewPage2FragmentRecyclerView#xff08;我的项目里RecycleView外层还套了一层SmartRefreshLayout#xff09;
因ViewPage2滑动太灵敏#xff0c;RecyclerView纵向倾斜滑动#xff0c;触发ViewPage2横向滑动而导致的滑动冲突问题
解决方案#xff1a;
…问题描述
场景ViewPage2FragmentRecyclerView我的项目里RecycleView外层还套了一层SmartRefreshLayout
因ViewPage2滑动太灵敏RecyclerView纵向倾斜滑动触发ViewPage2横向滑动而导致的滑动冲突问题
解决方案
纵向倾斜滑动时其实纵向、横向这两个动作都已触发了在横向灵敏度高的情况下可通过给横向滑动设置一个最小临界条件控制横向滑动的触发条件不至于横向滑动那么灵敏。
因我的子布局是SmartRefreshLayoutRecycleView如果你的子布局就只有RecycleView只需将我下面自定义的CustomRefreshLayout 类里的SmartRefreshLayout替换成RecycleView就行。
/*** 解决ViewPage2内嵌RecyclerView时因ViewPage2滑动太灵敏RecyclerView纵向倾斜滑动* 触发ViewPage2横向滑动的滑动冲突问题*/
class CustomRefreshLayout JvmOverloads constructor(context: Context, attrs: AttributeSet? null, defStyleAttr: Int 0
) : SmartRefreshLayout(context, attrs, defStyleAttr) {private var startX 0fprivate var startY 0fcompanion object {const val MIN_DISTANCE 100 // 设置一个最小滑动距离以减少误判}override fun dispatchTouchEvent(ev: MotionEvent): Boolean {when (ev.action) {MotionEvent.ACTION_DOWN - {startX ev.xstartY ev.yparent.requestDisallowInterceptTouchEvent(true) // 初始按下时不让父控件拦截}MotionEvent.ACTION_MOVE - {val endX ev.xval endY ev.yval disX abs(endX - startX)val disY abs(endY - startY)// 如果横向滑动距离大于纵向滑动距离且大于设定的最小距离则认为是水平滑动if (disX disY) {Log.e(dispatchTouchEvent 横向滑动:, disX $disX disY $disY)// 判断左右滑动的灵敏度当左右滑动距离大于100 允许父控件处理滑动。if (disX MIN_DISTANCE) {parent.requestDisallowInterceptTouchEvent(false)}} else {Log.e(dispatchTouchEvent 纵向滑动:, disX $disX disY $disY)// 纵向滑动不让父控件拦截parent.requestDisallowInterceptTouchEvent(true)}}MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL - {// 触摸事件结束时恢复默认行为parent.requestDisallowInterceptTouchEvent(false)}}return super.dispatchTouchEvent(ev)}
}CustomRefreshLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.recyclerview.widget.RecyclerViewandroid:idid/rvandroid:layout_widthmatch_parentandroid:layout_heightwrap_content/
/CustomRefreshLayout