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 (将#修改为@)