RecyclerView侧滑动画异常:自定义实现未达预期滑动效果
问题原因分析
你的自定义实现失效的核心原因是:DefaultUIUtil.onDraw() 仅负责绘制滑动时的辅助视觉效果(比如侧滑背景),不会主动修改目标视图的实际位移属性。而父类的 onChildDraw() 方法内部除了调用 DefaultUIUtil.onDraw(),还同步处理了视图的 translationX 位移更新、滑动状态同步等关键逻辑,这才是视图能正确滑动的核心。
你的代码只调用了绘制逻辑,没有更新目标视图的实际位置,所以视觉上看不到预期的滑动效果。
修复方案
需要在自定义逻辑中手动同步目标视图的位移,并完善滑动取消时的状态重置逻辑,修改后的代码如下:
override fun onChildDrawOver( c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean ) { val itemView = viewHolder.itemView val isCanceled = dX == 0f && !isCurrentlyActive if (isCanceled) { // 滑动取消时重置目标视图的位移,避免停留在半滑状态 if (viewHolder is OrderDetailProductsAdapter.OrderProductItemViewHolder) { val binding = LayoutHistoryDetailItemBinding.bind(itemView) binding.itemHistoryDetailMainView.translationX = 0f } super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, false) return } if (viewHolder is OrderDetailProductsAdapter.OrderProductItemViewHolder) { val binding = LayoutHistoryDetailItemBinding.bind(itemView) val targetView = binding.itemHistoryDetailMainView // 1. 手动设置目标视图的位移,这是视图能滑动的核心 targetView.translationX = dX / 2 // 2. 调用DefaultUIUtil绘制辅助视觉效果(比如侧滑背景) getDefaultUIUtil().onDraw(c, recyclerView, targetView, dX / 2, dY, actionState, isCurrentlyActive) } else { // 非目标ViewHolder,调用父类默认逻辑 super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) } }
关键修改点说明
- 增加
targetView.translationX = dX / 2:直接修改视图的位移属性,让视图跟随滑动手势移动到预期的半屏位置。 - 完善取消滑动时的重置逻辑:在滑动取消时把目标视图的位移重置为0,避免视图停留在半滑状态无法恢复。
- 补充非目标ViewHolder的处理:确保其他类型的ViewHolder仍能使用父类的默认侧滑逻辑,避免影响整体功能。
内容的提问来源于stack exchange,提问作者Muhammad Umar
相关产品推荐
相关产品推荐

