当用户将手从屏幕上移开时,如何使 Recycler View 滚动缓慢而流畅?

Posted

技术标签:

【中文标题】当用户将手从屏幕上移开时,如何使 Recycler View 滚动缓慢而流畅?【英文标题】:How to make a Recycler View scroll slow and smooth when the user takes hands off the screen? 【发布时间】:2021-10-18 20:07:21 【问题描述】:

这就是我快速滚动时当前的实现方式。

在第二个中,回收站视图中的所有项目都显示到最后。我想要实现的是如下所示(现场演示:Play 商店中的回收站视图),

即使我们快速滚动,它也会显示 1 或 2 个项目,因此感觉很自然。我怎样才能使回收器视图以这种方式运行?

代码:

适配器

class CustomAdapter(private val mList: List<ItemsViewModel>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder 
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.card_view_design, parent, false)

        return ViewHolder(view)
    

    override fun onBindViewHolder(holder: ViewHolder, position: Int) 

    

    override fun getItemCount(): Int 
        return mList.size
    

    class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) 
        val imageView: ImageView = itemView.findViewById(R.id.imageview)
        val textView: TextView = itemView.findViewById(R.id.textView)
    

实施

val recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
recyclerview.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false)
val data = ArrayList<ItemsViewModel>()
val adapter = CustomAdapter(data)
recyclerview.adapter = adapter

【问题讨论】:

【参考方案1】:

RecyclerView水平滚动时,scrollHorizontallyBy()会被多次调用,dx值可以根据手指的fling(push)值使滚动表现得平滑而真实。

垂直RecyclerView 相同,scrollVerticallyBy() 使用不同的 dy 值调用。

因此,您可以操纵此 dx 值以获得所需的行为;在您的情况下,您需要获得较小的 dx 值。

您会想到一个固定的dx 值,但这并不自然;相反,您可以将其除以固定数量以缩小相同的 dx 值。

这里我使用了一个任意值,您可以根据需要对其进行操作。

因此,您需要在使用水平 recyclerView 时使用自定义 LinearLayoutManager 并覆盖 scrollHorizontallyBy()

class MyLinearLayoutManager(context: Context?, orientation: Int, reverseLayout: Boolean) :
    LinearLayoutManager(context, orientation, reverseLayout) 

    override fun scrollHorizontallyBy(
        dx: Int,
        recycler: RecyclerView.Recycler?,
        state: RecyclerView.State?
    ): Int 
        var newDx = (dx / 1.2).toInt() // 1.2 is an arbitrary value 
        if (newDx == 0 && dx != 0)  // To have no 0 values (Optionally)
            newDx = 1
        
        
        return super.scrollHorizontallyBy(newDx, recycler, state)
    


【讨论】:

以上是关于当用户将手从屏幕上移开时,如何使 Recycler View 滚动缓慢而流畅?的主要内容,如果未能解决你的问题,请参考以下文章

当用户触摸屏幕时,删除图像上的模糊效果[关闭]

动画视图并中途停止

UIResponder 类中的触摸事件响应方法

如何提高 UITableVIew 的性能?

如何使 Recycler View 表现得像 PlayStore Recycler Views

当网页点击tab键切换输入的文本框时,整个网页会出现上移的情况?如何解决....急急.......