一丶不多说废话,直接看图效果
二丶核心就是一个recyclerview,其本身就有一个 smoothScrollToPosition()滑动到指定的位置,但是这个过程很快,不是我们想要的效果, 这个方法里面最终调用的是LinearLayoutManager的smoothScrollToPosition()方法,所以我们需要重写LinearLayoutManager的smoothScrollToPosition()方法来控制滑动速度,接下来上代码:
import android.content.Context
import android.graphics.PointF
import android.util.DisplayMetrics
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
class AutoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) {
// 控制水平滚动速度
override fun smoothScrollToPosition(recyclerView: RecyclerView, state: RecyclerView.State, position: Int) {
val linearSmoothScroller: LinearSmoothScroller = object : LinearSmoothScroller(recyclerView.context) {
override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
return this@AutoScrollLayoutManager.computeScrollVectorForPosition(targetPosition)
}
override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
// 计算滑动每个像素需要的时间,这里应该与屏幕适配;
return 40f / displayMetrics.density
}
}
linearSmoothScroller.targetPosition = position
startSmoothScroll(linearSmoothScroller)
}
}
三丶为了实现一直滚动下去,所以需要在adapter中返回itemCount为Int.MAX_VALUE:
override fun getItemCount(): Int {
return if (mDataList.isNotEmpty()) Int.MAX_VALUE else 0
}
三丶然后像普通的LinearLayoutManager设置给Recyclerview,再给Recyclerview设置Adapter之后调用Recyclerview.smoothScrollToPosition(Int.MAX_VALUE),注意看标红这里是Int的最大值,也就是一直滚动下去,那么问题来了,数据是有限的,所以就需要实现数据循环,在adapter的onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)方法里面,我们用自定义的index来获取下个位置的数据对象,每当index为数据的数量的长度时说明需要重新循环,所以重新设置index为0,代码如下:
var index = 0
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (index % (mDataList.size - 1) == 0){
// 数据进行下一次的循环
index = 0
}
val horizontalGame = mDataList[index++]
}