アニメーションの問題を開始するstartAnimation

5162 ワード

private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            //  
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                mIvCurrentBgAnimation.setVisibility(View.VISIBLE);
            }


            @Override
            public void onAnimationEnd(Animation animation) {
                Drawable d = mIvCurrentBgAnimation.getDrawable();
                mIvCurrentBgAnimation.setImageBitmap(null);
                mAnimationView.setImageDrawable(d);
                mIvCurrentBgAnimation.setVisibility(View.GONE);
            }


            @Override
            public void onAnimationRepeat(Animation animation) {


            }
        });
        mIvCurrentBgAnimation.startAnimation(animation);

}
以上の動画を複数回連続して実行すると動画効果が1回しか現れず、設定された画像がすぐに消えてしまう原因onAnimationEndが複数回連続して実行されます1回実行するとmIvAnimationの画像がnullになります
回の実行時にmIvAnimationの中のピクチャーが空なためすべてのmIvも空になります以上の問題が発生します
以上の問題を解決する方法:
方法1.onAnimationEndメソッドmIvAnimationのピクチャを取得するのではなくgetThumbPathメソッドを呼び出してピクチャを再取得する
 private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            //   
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                mIvCurrentBgAnimation.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                String path = getThumbPath(bean);
                if (TextUtils.isEmpty(path)) {
                    //   
                    int color = getResources().getColor(R.color.conversation_bg);
                    mIv.setImageDrawable(new ColorDrawable(color));
                } else {
                    mIv.setImageBitmap(BitmapFactory.decodeFile(path));
                }
                mIvCurrentBgAnimation.setImageBitmap(null);
                mIvCurrentBgAnimation.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        mIvCurrentBgAnimation.startAnimation(animation);
    }

方法2.最後にアニメーションを起動したときのanimationListenerがアニメーションのコールバックを実行するたびに現在のオブジェクトが最後のanimationListenerであるかどうかを判断する場合は、下に進み続けます.そうしないとreturn
 private void startSetConversationBgAnimation() {
        String path = getThumbPath(bean);
        if (TextUtils.isEmpty(path)) {
            //   
            int color = getResources().getColor(R.color.conversation_bg);
            mIvAnimation.setImageDrawable(new ColorDrawable(color));
        } else {
            mIvAnimation.setImageBitmap(BitmapFactory.decodeFile(path));
        }
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.activity_conversation_bg_translate_animation);
        mAnimationListener = new Animation.AnimationListener() {
            private boolean checkInstance() {
                return this == mAnimationListener;
            }

            @Override
            public void onAnimationStart(Animation animation) {
                if (checkInstance()) {
                    mIvAnimation.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (!checkInstance()) {
                    return;
                }
                Drawable d = mIvAnimation.getDrawable();
                mIvAnimation.setImageBitmap(null);
                mIv.setImageDrawable(d);
                mIvAnimation.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        };
        animation.setAnimationListener(mAnimationListener);
        mIvCurrentBgAnimation.clearAnimation();
        mIvCurrentBgAnimation.startAnimation(animation);
    }

2回連続して実行した場合方法1回目2回目はアニメーション効果がないように見えます直接交換方法2回目はアニメーション効果があるように見えます
アニメーション2を使用すると、通常の2回目のアニメーション起動時に地図が1回目のときの地図を2回目のときの地図に変更したい場合は、preBm変数を追加します.コード開始時にpreBmが空でなければmIvの画像をpreBmに設定します.