老规矩, 无图言D, 直接上图
图
![](https://i-blog.csdnimg.cn/blog_migrate/04867e50f64322d08a8d386c636b5f91.gif)
代码
package com.pb.test.bilibili.home
import android.content.Context
import android.graphics.PointF
import android.util.DisplayMetrics
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
import kotlin.math.ceil
import kotlin.math.sqrt
/**
*
* @author : YingYing Zhang
* @e-mail : 540108843@qq.com
* @time : 2023-02-25
* @desc :
*
*/
class SnapLayoutManager(
val context: Context, orientation: Int = RecyclerView.HORIZONTAL, reverseLayout: Boolean = false,
val isInAbTest: Boolean = false
) : LinearLayoutManager(context, orientation, reverseLayout) {
override fun smoothScrollToPosition(
recyclerView: RecyclerView?, state: RecyclerView.State?, position: Int
) {
val smoothScroller = object : LinearSmoothScroller(context) {
override fun getVerticalSnapPreference() = SNAP_TO_START
override fun getHorizontalSnapPreference() = SNAP_TO_START
smoothScroller.targetPosition = position
startSmoothScroll(smoothScroller)
}
}
小小总结
对, 没错, 两行代码就实现了, 只需要重写 getVerticalSnapPreference 和 getHorizontalSnapPreference, 指定返回值为 SNAP_TO_START, recyclerView 每次滑动后, 就会对齐到 item 左边了, 还有其他返回值, 可以自行研究.
当然如果想要做出来上"图"中的效果, 需要好好计算 recyclerView 一下, 当然需要根据需求细节来实现对应的效果, 由于"图"中的代码写的不好, 就不贴了, 主要是之前不知道 layoutManager 有这个方法 SNAP_TO_START, 一直没有找到实现方案, 踩了很多坑...
当然自定义 SnapHelper 也可以实现类似效果, 不过要根据具体的需求来讨论了, 就比如我这里是需要实现翻页效果, 但翻页后, 如果没有达到翻页临界值, 需要返回之前页, 但这时发现找不到对应的 item 了(被回收了...), 我哭死, 代码都快写完了, 才发现实现不了...
有需要的小伙伴直接拿走, 如有问题, 请留言~