一丶不多说废话,直接看图效果
二丶核心就是一个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++] }