微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RecyclerView 中的动画在调试模式下工作,但在使用 Proguard 的发布模式下无效

如何解决RecyclerView 中的动画在调试模式下工作,但在使用 Proguard 的发布模式下无效

我正在尝试使用以下代码为回收视图中的项目设置动画:

my_recyclerview.viewTreeObserver.addOnPreDrawListener(
            object : ViewTreeObserver.OnPreDrawListener {
                override fun onPreDraw(): Boolean {
                    viewTreeObserver.removeOnPreDrawListener(this)
                    for (i in 0 until childCount) {
                        val view: View = getChildAt(i)

                        val translationValue = if (layoutManager?.width != null) -layoutManager!!.width.toFloat() else 0f

                        view.translationX = translationValue

                        val translationAnimator: Animator = ObjectAnimator.ofFloat(
                            view,"translationX",translationValue,0f
                        )
                        translationAnimator.duration = 300
                        translationAnimator.startDelay = i * 50.toLong()
                        translationAnimator.start()
                    }
                    return true
                }
            })

它在调试模式下没有任何问题:项目从侧面一个一个地“滑入”。 但是,当我生成使用 proguard 的发布 apk 时,没有抛出任何错误,但动画根本不起作用。

编辑以澄清我确实在不使用 Proguard 的情况下尝试了发布版本(minifyEnabled false),并且动画效果很好,所以它必须是混淆。

我试图在 proguard 中包含一些“保留”规则以保留 ObjectAnimator,甚至是整个 android.animation 包,但要么我没有正确设置规则,要么我错过了其他东西。

例如,我试过:

-keep class android.animation.ObjectAnimator {*;}

以及

-keep class android.animation.ObjectAnimator.** {*;}

还有这个我在谷歌上找到的:

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

(上次编辑) 还尝试包含最严格的规则:

-keep class android.animation.ObjectAnimator { *; }
-keep class android.animation.ObjectAnimator {
   void set*(***);
   *** get*();
}
-keepclassmembers class android.animation.ObjectAnimator {
   void set*(***);
   *** get*();
}
-keep class android.widget.FrameLayout { *; }
-keep class android.widget.FrameLayout {
    void set*(***);
    *** get*();
}
-keepclassmembers class android.widget.FrameLayout {
   void set*(***);
   *** get*();
}

-keep class android.view.View { *; }
-keep class android.view.View {
   void set*(***);
   *** get*();
}
-keepclassmembers class android.view.View {
   void set*(***);
   *** get*();
}

此时我尝试了很多选择,我完全迷失了。

没有任何效果。任何帮助或指导将不胜感激

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。