使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作
Posted
技术标签:
【中文标题】使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作【英文标题】:Rotation animation not working properly after using submitList from ListAdapter 【发布时间】:2021-10-12 23:12:49 【问题描述】:在我的项目中,我有一个可扩展的回收站视图。几乎一切正常。
当我展开视图时,我有一个 V 形,我想为折叠动画执行 180º 旋转,反之亦然。
我正在使用此函数对其中一种状态进行 view.animate().rotation(180f)
的轮换,而对于另一种状态,我将 0
传递给 rotation
函数。
图标第一次与动画一起旋转。我现在的问题是,我第二次调用submitList(List<UIModel>)
它本身并没有执行动画,而是图标闪烁到 180º 状态。
一个重要的注意事项是我正在使用 MVI,并且我向ViewHolder
添加了一个点击侦听器,这只是Fragment
的回调,它将将此信息传递给ViewModel
。 ViewModel
将更新其状态以使该列表项处于展开状态,然后提交该列表。
如果我在点击侦听器中直接调用上述函数,而不调用submitList()
函数,则旋转动画效果很好。
总而言之,这是流程(第 8 步第一次不适用,它与动画一起正常工作):
-
用户点击 chevron;
回调被调用;
片段通知视图模型;
查看模型更新状态;
片段被通知有变化;
fragment 提交列表调用 (
submitList()
);
onBindViewHolder
被调用,我根据UIModel isExpanded
变量进行旋转动画。
应用了旋转,但没有任何动画,只是在两个位置之间轻弹
【问题讨论】:
【参考方案1】:两个猜测:
旋转值是DiffUtil.Callback
的一部分吗? (表示项目更改的值或其他内容)。
您是否尝试过为了 android 将 view.animate().rotation(180f)
替换为更愚蠢的东西,例如:
view.post( ... )
这将在 next 渲染帧内执行您的动画;我怀疑动画被埋在那里并显示了最终状态(物体已经旋转)。
【讨论】:
1.是的,我的意思是,它是 DiffUtil 引用的模型的一部分; 2. 还没有,马上试试,会更新评论 按照您的建议使用view.post( ... )
运气不佳
我也有类似的感觉,动画被埋没了,因为如果我只是执行动画而不再次调用submitList()
,动画效果很好。
这可能是因为您使用的视图动画并没有真正修改视图,而只是修改了视图的绘制位置。我可能会尝试通过value animator 或object animator 使用属性动画。查看Property Animation 文档以获取更多信息,也许这对您来说效果更好。
是的,Android Animation 多年来一直在经历“变化”,所以您并不孤单。如果 RotateAnimation 有效(使用填充标志),那么您就可以开始了。除非您有问题,否则无需为其他事情烦恼。 如果它没有损坏,请不要修复它 :) 但是,我建议你看看 Animator,因为它们相对易于使用且非常方便(尤其是 ObjectAnimator,你可以在可以将rotation
作为值传递,因为它会在内部调用setRotation(...)
)。但如果它有效,请享受:)以上是关于使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作
如何将自定义 ListAdapter 设置为 appwidget 中的列表视图?
DiffUtil 重绘 ListAdapter Kotlin 中的所有项目
从android eclipse中的片段刷新或更新listadapter