如何实现惯性滚动?
主要借助于 Scroller
的 fling
方法,fling可以让View在滑动到某个位置之后以一定的速度惯性滚到一段距离。因此在收到 MotionEvent.ACTION_UP
事件时(即手指抬起时),将惯性滚动前的初始ScrollX值作为fling的起始参数,然后依旧是在 computeScroll
方法里面获取最新滚动到的ScrollX值去同步给其他LinearLayout,实现所有横向列表整体惯性。
如何处理侧滑与横向列表的滑动冲突?
这里的侧滑实现是基于 SwipeRecyclerView 这个库的基础上进行修改,所以这里自定义一个 RecyclerView
继承于 SwipeRecyclerView
重写其 onInterceptTouchEvent
方法,每次收到 MotionEvent.ACTION_MOVE
事件的时候,判断当前内容区是否滑到了最左侧界线,分别做如下处理:
如果此时位于最左侧界线,判断当前手势是左滑还是右滑,如果是右滑,那就通过super.onInterceptTouchEvent(e)交由SwipeRecyclerView去处理侧滑逻辑,如果是左滑,则需要return true拦截事件,然后在onTouchEvent中做横向滚动处理。 如果当前不在左侧界线,说明无论左滑还是右滑,横向列表皆有滑动的空间,同样return true拦截事件交由onTouchEvent中做横向滚动处理。
在项目根目录的build.gradle添加:
allprojects {
repositories {
…
maven { url ‘https://jitpack.io’ }
}
}
在项目的build.gradle添加如下依赖:
implementation ‘com.github.GitHubZJY:XTableView:v1.0.0’