2017-05-16 18 views
0

3つのLinearLayoutを含むフラグメントがあります。Android ObjectAnimatorが終了前にキャンセルされました

  • がクリックされたいずれかの0から1重量と

    • アニメーション:デフォルト 、最初のものは、1 重量属性を持つそれぞれが2つのアニメーションをトリガーOnClickListenerを有するのLinearLayout 1のための0から1の重量と

      アニメーションは、現在

    私の問題はいつかアニメーションが完全に仕上げされていないということである開かれました。ここで

    はOnClickListenerによってトリガーコードです:ここでは

    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のコードです:アニメーションがしようとしていないときにここで

    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; 
    } 
    

    は私が持っているログです終了:

    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を見つけました。

    私はカスタムアニメーションでObjectAnimatorを交換した。ここで

     /** 
        * 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です:

    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; 
    } 
    } 
    
    関連する問題