Создание анимации в 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