Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Android PropertyValuesHolder与proguard一起使用_Android_Android Animation_Proguard - Fatal编程技术网

如何将Android PropertyValuesHolder与proguard一起使用

如何将Android PropertyValuesHolder与proguard一起使用,android,android-animation,proguard,Android,Android Animation,Proguard,我正在使用PropertyValuesHolder为我的Android应用程序中的一些视图设置动画。动画在我的设备上运行良好,直到我在没有任何动画的情况下进行发布构建。我认为问题与混淆有关,因为属性名被称为字符串名,例如Panel1W 没有抛出异常。只是没有动画。我能找到的最接近的东西是NoSuchMethodException,我们需要在proguard.cfg中使用-keep命令。我在proguard.cfg中尝试了以下操作,但没有成功 -keep public class com.myco

我正在使用PropertyValuesHolder为我的Android应用程序中的一些视图设置动画。动画在我的设备上运行良好,直到我在没有任何动画的情况下进行发布构建。我认为问题与混淆有关,因为属性名被称为字符串名,例如Panel1W

没有抛出异常。只是没有动画。我能找到的最接近的东西是NoSuchMethodException,我们需要在proguard.cfg中使用-keep命令。我在proguard.cfg中尝试了以下操作,但没有成功

-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel1W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel1W(java.lang.Integer); }
-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel2W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel2W(java.lang.Integer); }
-keep public class com.mycompany.myapp.HomeActivity { java.lang.Integer getPanel3W(); }
-keep public class com.mycompany.myapp.HomeActivity { void setPanel3W(java.lang.Integer); }
我遗漏了什么吗?下面是代码。谢谢

PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[3];
arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("Panel1W", mPanel1.getWidth(), 0);
arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", 360, 1280);
arrayOfPropertyValuesHolder[2] = PropertyValuesHolder.ofInt("Panel3W", 0, (int)(screenWidth * 0.65));

ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
arrayOfPropertyValuesHolder).setDuration(time);
localObjectAnimator.setInterpolator(sCollapseInterpolator);
localObjectAnimator.start();
我也有getter和setter方法

    public int getPanel1W() {
        return ((ViewGroup.MarginLayoutParams) mPanel1.getLayoutParams()).width;
    }

    public void setPanel1W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel1.getLayoutParams();
        lp.width = paramInt;
        mPanel1.setLayoutParams(lp);
    }

    public int getPanel2W() {
        return ((ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams()).width;
    }

    public void setPanel2W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams();
        lp.width = paramInt;
        mPanel2.setLayoutParams(lp);
    }  

    public int getPanel3W() {
        return ((ViewGroup.MarginLayoutParams) mPanel3.getLayoutParams()).width;
    }

    public void setPanel3W(int paramInt) {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel3.getLayoutParams();
        lp.width = paramInt;
        mPanel3.setLayoutParams(lp);        
    }

请检查字符串Panel1W、Panel2W和Panel3W是否由proguard混合。我认为您可以在类中定义这些字符串,并在proguard.cfg中保留以保护这些字符串。

请检查字符串Panel1W,Panel2W和Panel3W由proguard混合使用。我认为您可以在类中定义这些字符串,并在proguard.cfg中保留以保护这些字符串。

诀窍在于,PropertyValuesHolder调用的方法要么是set*要么是get*,因此保留这些方法的proguard规则是:

void set*(***);
*** get*();
因此,基于此,如果动画目标只是少数几个类中的一个,请为每个动画目标类添加以下内容:

-keep class my.package.MyClass {
    void set*(***);
    *** get*();
}
如果所有目标都扩展了某个基类,则可以添加单个规则来保存它们:

-keep class * extends my.package.MyBaseClass {
    void set*(***);
    *** get*();
}

诀窍在于,PropertyValuesHolder调用的方法要么是set*要么是get*,因此保留这些方法的ProGuard规则是:

void set*(***);
*** get*();
因此,基于此,如果动画目标只是少数几个类中的一个,请为每个动画目标类添加以下内容:

-keep class my.package.MyClass {
    void set*(***);
    *** get*();
}
如果所有目标都扩展了某个基类,则可以添加单个规则来保存它们:

-keep class * extends my.package.MyBaseClass {
    void set*(***);
    *** get*();
}

谢谢,我尝试在类中定义字符串,并尝试使用-keep public类保留整个类,但即使这样也不起作用,所以可能我走错了方向。谢谢你的输入,我尝试在类中定义字符串,并尝试使用-keep public类保留整个类,但即使这样也不起作用,所以可能我走错了方向。谢谢你的意见