}
protected abstract fun createAnimation(): Animator
private fun stopAnimation() {
animation?.cancel()
animation = null
}
}
不幸的是,这也没有用(虽然我觉得它应该能够正常工作的)。说实话,我不知道问题的具体原因。可能在普通的情况下会有效,但是对于 RecyclerView
就不行了。前段时间我就遇到了这个问题:如果使用 isShown
来跟踪一些东西是否在 RecyclerView
中显示。因此可能我的最终解决方案并不正确,但至少在我的方案中,它能按照我的期望工作:
// InfiniteAnimateView.kt
abs
tract class InfiniteAnimateView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private var animation: Animator? = null
/**
- 我们不可以使用
onVisibilityAggregated
方法,因为它只在 SDK 24 以上被支持,而我们的最低 SDK 是 21
*/
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
if (isDeepVisible()) startAnimation() else stopAnimation()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
startAnimation()
}
override fun onDetachedFromWindow() {
stopAnimation()
super.onDetachedFromWindow()
}
private fun startAnimation() {
if (!isAttachedToWindow || !isDeepVisible()) return
if (animation == null) animation = createAnimation().apply { start() }
}
protected abstract fun createAnimation(): Animator
private fun stopAnimation() {
animation?.cancel()
animation = null
}
/**
- 可能这个函数上实现了 View.isShown,但我发觉到它有一些问题。
- 我在 Lottie lib 中也遇到了这些问题。不过因为我们总是没有时间去深入研究
- 我决定使用了这个简单的方法暂时解决这个问题,只为确保它能够正常运转
- 我到底需要什么 = =
- 更新:尝试使用 isShown 代替这个方法,但没有成功。所以如果你知道
- 如何改进,欢迎评论区讨论一下
*/
private fun isDeepVisible(): Boolean {
var isVisible = isVisible
var parent =