2012-07-25 4 views
0

안드로이드 PropertyValuesHolder을 사용할 수 있습니다. 애니메이션이 전혀없는 릴리스 빌드를 수행 할 때까지 내 장치에서 애니메이션이 제대로 실행됩니다. (문제는 속성 이름이 문자열 이름 (예 : "Panel1W")이므로 난독 처리와 관련이 있다고 생각합니다.)어떻게 내 안드로이드 응용 프로그램에서 일부보기 애니메이션 PropertyValuesHolder을 사용하고 난독

예외가 발생하지 않았습니다. 애니메이션이 없습니다. http://proguard.sourceforge.net/index.html#manual/troubleshooting.html에서 찾을 수있는 가장 가까운 것은 proguard.cfg에서 -keep 명령을 사용해야하는 NoSuchMethodException입니다. 내 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);   
    } 

답변

0

, "Panel2W"와 "Panel3W는"proguard.I에 의해 혼합하여 문자열 "Panel1W는"당신이이 문자열을 보호하기 위해 proguard.cfg에 클래스와 -keep에서 이러한 문자열을 정의 할 수 있다고 생각한다면 확인하십시오.

+0

감사합니다. 클래스의 문자열 정의를 시도하고 -keep 공용 클래스 를 사용하여 전체 클래스를 유지하려고 시도했지만 작동하지 않는 경우도 있습니다. 잘못된 트랙. 의견을 보내 주셔서 감사합니다. – Dittimon

5

트릭은 PropertyValuesHolder에 의해 호출 방법 중 하나 set* 또는 get*, 그래서 ProGuard 규칙이 이러한 방법을 유지하기가 있다는 사실이다 : 그 기반으로 그래서

void set*(***); 
*** get*(); 

, 당신의 애니메이션 목표 인 경우 몇 클래스 중 하나는 애니메이션 대상 클래스 당이 추가 : 당신의 목표는 몇 가지 기본 클래스를 확장 할 경우

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

, 당신은 그들 모두를 저장하는 하나의 규칙을 추가 할 수 있습니다

관련 문제