Создание анимации в ImageView при изменении ресурса изображения
У меня есть только один ImageView
в моем макете, и я меняю его ресурс, когда обнаружено событие гастареи. Я просто хочу показать анимацию при изменении ресурса ImageView. Можно ли использовать ViewFlipper
с one
ImageView?
Ответы
Ответ 1
Для одного изображения вы можете использовать эту вспомогательную функцию:
public static void ImageViewAnimatedChange(Context c, final ImageView v, final Bitmap new_image) {
final Animation anim_out = AnimationUtils.loadAnimation(c, android.R.anim.fade_out);
final Animation anim_in = AnimationUtils.loadAnimation(c, android.R.anim.fade_in);
anim_out.setAnimationListener(new AnimationListener()
{
@Override public void onAnimationStart(Animation animation) {}
@Override public void onAnimationRepeat(Animation animation) {}
@Override public void onAnimationEnd(Animation animation)
{
v.setImageBitmap(new_image);
anim_in.setAnimationListener(new AnimationListener() {
@Override public void onAnimationStart(Animation animation) {}
@Override public void onAnimationRepeat(Animation animation) {}
@Override public void onAnimationEnd(Animation animation) {}
});
v.startAnimation(anim_in);
}
});
v.startAnimation(anim_out);
}
Ответ 2
Я думаю, ImageSwitcher - лучший подходящий компонент для задачи.
Ответ 3
Вот пример использования ImageSwitcher, например, @Константин Буров предложил:
Добавьте этот элемент ImageSwitcher
в свой XML-макет:
<ImageSwitcher
android:id="@+id/slide_trans_imageswitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ImageSwitcher>
Создавать анимации в res/anim/
:
Анимация:
//left_to_right_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700"/>
</set>
И в анимации:
//left_to_right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="-100%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700"/>
</set>
Инициализируйте их в своем коде:
Animation in = AnimationUtils.loadAnimation(this, R.anim.left_to_right_in);
Animation out = AnimationUtils.loadAnimation(this, R.anim.left_to_right_out);
Инициализируйте свой ImageSwitcher
:
private ImageSwitcher imageSwitcher;
imageSwitcher = (ImageSwitcher)findViewById(R.id.slide_trans_imageswitcher);
Прикрепите к нему анимацию:
imageSwitcher.setInAnimation(in);
imageSwitcher.setOutAnimation(out);
Теперь каждый раз, когда вы устанавливаете ресурс изображения для ImageSwitcher
, он переключается в анимацию слайдов.
Например, мы можем изменить изображение каждые X секунд:
private int animationCounter = 1;
private Handler imageSwitcherHandler;
imageSwitcherHandler = new Handler(Looper.getMainLooper());
imageSwitcherHandler.post(new Runnable() {
@Override
public void run() {
switch (animationCounter++) {
case 1:
imageSwitcher.setImageResource(R.drawable.image1);
break;
case 2:
imageSwitcher.setImageResource(R.drawable.image2);
break;
case 3:
imageSwitcher.setImageResource(R.drawable.image3);
break;
}
animationCounter %= 4;
if(animationCounter == 0 ) animationCounter = 1;
imageSwitcherHandler.postDelayed(this, 3000);
}
});
Ответ 4
Рассмотрите возможность использования Rotate3dAnimation в демонстрационном приложении API.
Просмотp > Анимация > 3D-переход
Вы также можете проверить этот вопрос на SO