使用淡入淡出动画更改Android背景图像

16

我编写了一段代码,可以每5秒随机更改背景图片。现在我想使用淡入/淡出动画来更改背景图片,但我不知道该如何使用这个动画。

这是我的源代码:

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);

}

目前一切都好。 我可以随机更改背景图像,但我不知道如何使用淡入/淡出动画。

如果有人知道解决方案,请帮帮我,谢谢。


看一下这个:https://dev59.com/r3E85IYBdhLWcg3wx2n2 - Fenix
5个回答

24

你需要调用这些代码。

首先,你需要创建两个像这样的淡入淡出动画的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完成时更改fadeout。

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
运行得非常好。我将淡入和淡出应用于我的LinearLayout视图。不得不更改为500毫秒。2000太长了。 - apollosoftware.org
4
这句话翻译为:它应该是imageView.startAnimation(fadeIn);。 - Omid Aminiva
这并没有回答真正的问题。 这是关于ImageView(基本上是View)的动画,而不是一个Viewbackground - Bugs Happen
这个YouTube视频是真正的答案。 - Bugs Happen

6

要创建一个淡入动画效果,需要在您的 res 文件夹中创建一个名为“anim”的新文件夹,然后在其中创建一个名为“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>

现在要在您的ImageView上运行此动画,请在您的Activity中使用以下代码。
Animation anim = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
imageView.setAnimation(anim);
anim.start();

对于淡出动画,只需交换android:fromAlpha和android:toAlpha的值即可。

希望这可以帮到您。


2
你可以使用RelativeLayout,并添加一个背景视图层,将其高度和宽度都设置为match_parent。所有其他UI元素应该放在这个视图的顶部。在你的代码中,定义fadeOut和fadeIn动画。通过id找到背景视图,然后执行以下操作:
 xxxBackground.startAnimation(fadeOut);
 xxxBackground.setBackgroundResource(R.drawable.your_random_pic);
 xxxBackground.startAnimation(fadeIn);

您可以使用一些插值器来优化性能。


1
你需要使用动画来实现,首先要创建一个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) {
          }
});

你不需要处理程序。

1

kimkevin的回答是关于如何使一个View(可以是ImageViewTextView等)动起来,而不是一个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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接