2017-05-16 8 views
0

내부에 3 개의 LinearLayout이있는 조각이 있습니다. 기본적 , 처음 2 개 애니메이션 트리거 OnClickListener를 가지고 1 각각의 LinearLayout의 중량 특성을 가지고 클릭 한 1 0에서 무게Android ObjectAnimator가 끝나기 전에 취소되었습니다.

  • 애니메이션

  • 사람에 대한 0-1에서 무게

    애니메이션은 현재

내 문제는 언젠가 애니메이션이 완전히 마무리되지 않은 것입니다 열었습니다.

public class ViewWeightAnimationWrapper { 
private View view; 

public ViewWeightAnimationWrapper(View view) { 
    if (view.getLayoutParams() instanceof LinearLayout.LayoutParams) { 
     this.view = view; 
    } else { 
     throw new IllegalArgumentException("The view should be a LinearLayout"); 
    } 
} 

public void setWeight(float weight) { 
    Log.i(String.valueOf(view.getId()), "setWeight: " + weight); 
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); 
    params.weight = weight; 
    view.requestLayout(); 
} 

public float getWeight() { 
    return ((LinearLayout.LayoutParams) view.getLayoutParams()).weight; 
} 
다음

애니메이션이 가지 않을 때 내가 가지고있는 로그입니다 : 여기

private void launchAnimation(final LinearLayout llToExpand) { 
    ViewWeightAnimationWrapper animationWrapper = new ViewWeightAnimationWrapper(llToExpand); 
    ObjectAnimator anim = ObjectAnimator.ofFloat(animationWrapper, 
      "weight", 
      animationWrapper.getWeight(), 
      1f); 
    anim.setDuration(1000); 

    anim.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      Log.d("Anim1", "onAnimationEnd: Anim1 have ended"); 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      Log.d("Anim1", "onAnimationCancel: Anim1 have been canceled."); 
     } 
    }); 

    ViewWeightAnimationWrapper animationWrapper2 = new ViewWeightAnimationWrapper(mLlCurrentlyOpened); 
    ObjectAnimator anim2 = ObjectAnimator.ofFloat(animationWrapper2, 
      "weight", 
      animationWrapper2.getWeight(), 
      0f); 
    anim2.setDuration(1000); 

    anim2.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      Log.d("Anim2", "onAnimationEnd: Anim2 have ended"); 
      mLlCurrentlyOpened = llToExpand; 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      Log.d("Anim2", "onAnimationCancel: Anim2 have been canceled."); 
     } 
    }); 
    anim.start(); 
    anim2.start(); 
} 

내 ViewWeightAnimationWrapper의 코드입니다 : 여기

는 OnClickListener를 트리거 코드입니다 끝 :

I/2131755212: setWeight: 0.5 
I/2131755207: setWeight: 0.5 
I/2131755212: setWeight: 0.5251222 
I/2131755207: setWeight: 0.47487777 
I/2131755212: setWeight: 0.55174345 
I/2131755207: setWeight: 0.44825655 
D/Anim1: onAnimationCancel: Anim1 have been canceled. 
D/Anim1: onAnimationEnd: Anim1 have ended 
D/Anim2: onAnimationCancel: Anim2 have been canceled. 
D/Anim2: onAnimationEnd: Anim2 have ended 

내 애니메이션이 취소되지 않은 이유에 대한 실마리가 없습니다. 때마다.

내 애니메이션을 취소하는 방법을 어떻게 알 수 있습니까? 애니메이션을 취소 할 때 강제로 애니메이션을 끝낼 수 있습니까?

답변

0

왜 애니메이션이 취소되었는지에 대한 이유를 찾지 못했습니다. 설명서에서 동일한 객체가 동일한 객체에서 트리거 될 때 애니메이션이 취소되었다고합니다. 이는 내 경우가 아니 었습니다.

그러나 예상 한 결과를 얻는 해결 방법 here을 발견했습니다.

public class ExpandAnimation extends Animation { 

private float mStartWeight; 
private final float mEndWeight; 
private final LinearLayout mContent; 

public ExpandAnimation(LinearLayout content, float startWeight, 
       float endWeight) { 
    mStartWeight = startWeight; 
    mEndWeight = endWeight; 
    mContent = content; 
} 

@Override 
protected void applyTransformation(float interpolatedTime, 
            Transformation t) { 
    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContent 
      .getLayoutParams(); 
    mStartWeight = lp.weight; 
    lp.weight = (mStartWeight + ((mEndWeight - mStartWeight) * interpolatedTime)); 
    mContent.setLayoutParams(lp); 
} 

@Override 
public boolean willChangeBounds() { 
    return true; 
} 
} 
: 여기
 /** 
    * Launch the expand animation on the LinearLayout in parameter and launch the folding animation 
    * on the currently opened LinearLayout. 
    * @param llToExpand LinearLayout that we want to expand. 
    */ 
    private void launchAnimation(final LinearLayout llToExpand) { 

     // Create the and assign the animations 
     ExpandAnimation expand = new ExpandAnimation(llToExpand, 0, 1); 
     expand.setDuration(500); 
     ExpandAnimation fold = new ExpandAnimation(mLlCurrentlyOpened, 1, 0); 
     fold.setDuration(500); 

     // Start the animations 
     llToExpand.startAnimation(expand); 
     mLlCurrentlyOpened.startAnimation(fold); 

     // Switch the currently opened LinearLayout for the next time 
     mLlCurrentlyOpened = llToExpand; 
    } 

내 ExpandAnimation입니다 :

나는 사용자 지정 애니메이션으로 ObjectAnimator를 교체 한