构建和 Telegram 一样的上传动画,android面试项目经验

}

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 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值