アニメーションの問題を開始する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に設定します.