【问题标题】:NineOldAndroids ObjectAnimators don't work with ProGuard and signed apkNineOldAndroids ObjectAnimators 不适用于 ProGuard 和签名的 apk
【发布时间】:2014-04-02 22:53:12
【问题描述】:

我正在使用 NineOldAndroids 的 ObjectAnimators 使用以下代码淡入 Android Map v2 标记:

mMarkerSelected = mMap.addMarker(new MarkerOptions()
        .position(location.getLatLng())
        .title(location.getName())
        .snippet(location.getId())
        .icon(BitmapDescriptorFactory.defaultMarker(location.getMarkerHue())));
mMarkerSelected.setAlpha(0.0f);
ObjectAnimator.ofFloat(mMarkerSelected, "alpha", 0.0f, 1.f)
                .setDuration(300).start();

这与可调试版本的 apk 完美配合。

但是,当我签署我的 apk 并使用 ProGuard 时,突然标记不会淡入。我的猜测是 alpha 属性已被混淆,因此将 "alpha" 传递给 ObjectAnimator.ofFloat 与混淆的不匹配Marker 的 alpha 属性。使用 ProGuard 时如何使动画正常工作?

为了完整起见,这是我的 proguard-rules.txt 的唯一内容

-dontwarn com.squareup.okhttp.**

【问题讨论】:

    标签: android proguard nineoldandroids


    【解决方案1】:

    它使用反射,因此您需要完整的方法名称​​即setAlpha(),在你的 proguard 配置中是这样的:

     # This is due to ObjectAnimator using reflection to access get/sets
     -keep class com.your.package.ClassThatUsesObjectAnimator { *; }
    

    【讨论】:

    • 谢谢!我选择了-keepclassmembers class com.google.android.gms.maps.model.Marker { *; }。您可以更新答案,还是我应该保留使用 ObjectAnimator 的个人课程?
    • 你可以做任何一个,我个人会有一个类来控制动画但不保护标记也可以
    【解决方案2】:

    Nineolddroids 库已经开源,因此在其上运行 proguard 毫无意义。

    如果您可以在混淆自己的源文件或第三方开源库之间进行选择,最好选择您自己的源文件。

    将这些行添加到您的 proguard-project.txt 中,您的应用程序将正常运行。

    ## Nineolddroid related classes to ignore
    
    -keep class com.nineoldandroids.animation.** { *; }
    -keep interface com.nineoldandroids.animation.** { *; }
    -keep class com.nineoldandroids.view.** { *; }
    -keep interface com.nineoldandroids.view.** { *; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 2015-02-11
      • 1970-01-01
      • 2013-03-04
      • 2014-03-08
      • 2014-12-26
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多