一丶很少说废话,直接看图效果android
二丶核心就是一个recyclerview,其自己就有一个 smoothScrollToPosition()滑动到指定的位置,可是这个过程很快,不是咱们想要的效果, 这个方法里面最终调用的是LinearLayoutManager的smoothScrollToPosition()方法,因此咱们须要重写LinearLayoutManager的smoothScrollToPosition()方法来控制滑动速度,接下来上代码:ide
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:this
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,代码以下:spa
var index = 0
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (index % (mDataList.size - 1) == 0){
// 数据进行下一次的循环
index = 0
}
val horizontalGame = mDataList[index++]
}