Изменение фонового изображения Android с анимацией fade in/out

Я написал код, который может менять фоновое изображение случайным каждые 5 секунд. Теперь я хочу использовать анимацию fade in/out для изменения фонового изображения, но я не знаю, как я могу использовать эту анимацию.

Это мой источник:

void handlechange() {

    Handler hand = new Handler();
    hand.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            // change image here
            change();

        }

        private void change() {
            // TODO Auto-generated method stub

            Random rand = new Random();

            int index = rand.nextInt(image_rundow.length);

            mapimg.setBackgroundResource(image_rundow[index]);

            handlechange();
        }
    }, 4000);

}

На данный момент все в порядке. Я могу изменить фоновое изображение случайным образом, но я не знаю, как я могу использовать анимацию fade in/out.

Если кто-нибудь знает решение, пожалуйста, помогите мне, спасибо.

Ответ 1

Вам нужно назвать эти коды.

Во-первых, вам нужно создать два xml файла для анимации постепенного появления и исчезновения, как это.

fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:fillAfter="true"
        android:duration="2000"
        />
</set>

fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.0"
        android:fillAfter="true"
        android:duration="2000"
        />
</set>

Во-вторых, вы должны запустить анимацию imageView, как показано ниже, а также вы должны установить AnimationListener для изменения затухания по окончании fadein.

Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_out);
imageView.startAnimation(fadeOut);

fadeOut.setAnimationListener(new Animation.AnimationListener() {
      @Override
      public void onAnimationStart(Animation animation) {
      }
      @Override
      public void onAnimationEnd(Animation animation) {
          Animation fadeIn = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
          imageView.startAnimation(fadeIn);
      }
      @Override
      public void onAnimationRepeat(Animation animation) {
      }
});

Ответ 2

Для создания затухания в анимации создайте новую папку с именем "anim" в своей папке res и внутри нее, создайте "fade_in.xml" со ​​следующим кодом

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <alpha
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toAlpha="1.0" />

</set>

теперь, чтобы запустить эту анимацию на вашем изображении, используйте следующий код в своей деятельности

Animation anim = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
imageView.setAnimation(anim);
anim.start();

для анимации fadeout, просто меняйте значения android: fromAlpha и android: toAlpha

Надеюсь, что это поможет.

Ответ 3

Вы можете использовать relativeLayout и добавить один слой фонового представления, который устанавливает высоту и ширину match_parent. Все остальные элементы пользовательского интерфейса должны помещаться поверх этого представления. В вашем коде. Определите анимацию fadeOut и fadeIn. Найдите этот фоновый вид по id, а затем выполните следующее:

 xxxBackground.startAnimation(fadeOut);
 xxxBackground.setBackgroundResource(R.drawable.your_random_pic);
 xxxBackground.startAnimation(fadeIn);

Вы можете использовать некоторый интерполятор для настройки производительности.

Ответ 4

Вам нужна анимация AnimationDrawable с анимацией.

Первый шаг AnimationDrawable

-Создайте файл /res/anim/anim _android.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false">
    <item android:drawable="@drawable/android_1"
          android:duration="100"/>
    <item android:drawable="@drawable/android_2"
          android:duration="100"/>
    <item android:drawable="@drawable/android_3"
          android:duration="100"/>
    <item android:drawable="@drawable/android_4"
          android:duration="100"/>
    <item android:drawable="@drawable/android_5"
          android:duration="100"/>
    <item android:drawable="@drawable/android_6"
          android:duration="100"/>
    <item android:drawable="@drawable/android_7"
          android:duration="100"/>
</animation-list>

-Добавить ImageView с помощью android: src= "@anim/anim_android".

<ImageView
    android:id="@+id/myanimation"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@anim/anim_android" />

Второй шаг

- В вашей деятельности создайте AnimationDrawable и Animation

AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
            animationDrawable.setOneShot(true);
            animationDrawable.start();

    Animation animation = AnimationUtils.loadAnimation(YourActivity.this, android.R.anim.fade_in);

    imageView.setAnimation(animation);
        animation.start();
        animation.setAnimationListener(new Animation.AnimationListener() {
          @Override
          public void onAnimationStart(Animation animation) {
          }
          @Override
          public void onAnimationEnd(Animation animation) {
              Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, android.R.anim.fade_out);
              imageView.startAnimation(fadeOut);
          }
          @Override
          public void onAnimationRepeat(Animation animation) {
          }
});

вам не нужен обработчик.

Ответ 5

Ответа на этот вопрос kimkevin оживляет View (будь то ImageView, TextView и т.д.), а не фон из View. Это означает, что если вы хотите просто выделить какой-либо View, вам придется добавить другой View за ним (назовем его backgroundView) и анимировать этот backgroundView.

Используйте следующий код для анимации фона вида

val startColor = view.solidColor
val endColor = ContextCompat.getColor(context, R.color.your_color)

val colorAnim = ObjectAnimator.ofInt(view, "backgroundColor", startColor, endColor, startColor)
colorAnim.duration = 2000
colorAnim.setEvaluator(ArgbEvaluator())
colorAnim.start()