【问题标题】:How to make an imageView change background randomly?如何使 imageView 随机更改背景?
【发布时间】:2024-05-16 20:15:01
【问题描述】:

我有一个有 5 个背景可供选择的图像视图。我想淡出 image2 并将 image5 设置为具有淡入效果的背景。这应该会随机变化。问题是,我如何有效地做到这一点?

这就是我使用系统动画赋予淡入和淡出效果的方式-

淡出

  Animation out = AnimationUtils.makeOutAnimation(this, true);
        viewToAnimate.startAnimation(out);
        viewToAnimate.setVisibility(View.INVISIBLE);

淡入

   Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in);
        viewToAnimate.startAnimation(in);
        viewToAnimate.setVisibility(View.VISIBLE);

这就是我改变背景的方式-

search_engine_identifier.setImageResource(R.drawable.ic_yahoo);

【问题讨论】:

    标签: android background-image android-imageview effects


    【解决方案1】:

    您可以使用Android中的Frame Animations来改变ImageView的背景。

    动画列表

    Animation-list 是选择的默认帧动画,因为它是在 API 1 中引入的。它适用于任何地方,而且很简单。它只是以给定的顺序和给定的持续时间循环浏览一系列提供的图像。

    这是一个我的心的动画列表示例,放置在 res/drawable/animation_list_filling.xml 中:

    <?xml version="1.0" encoding="utf-8"?>
    
        <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
                        android:oneshot="true">
    
            <item
                android:duration="500"
                android:drawable="@drawable/ic_heart_0"/>
    
            <item
                android:duration="500"
                android:drawable="@drawable/ic_heart_25"/>
    
            <item
                android:duration="500"
                android:drawable="@drawable/ic_heart_50"/>
    
            <item
                android:duration="500"
                android:drawable="@drawable/ic_heart_75"/>
    
            <item
                android:duration="500"
                android:drawable="@drawable/ic_heart_100"/>
    
        </animation-list>
    

    设置 ImageViews

    是时候设置一些 ImageViews 供我们使用了。具体来说,我们将拥有三个 ImageView,一个用于我们之前定义的每个 XML Drawable。将以下代码放入您选择的 Layout 中,然后将其放入 Activity:

    <ImageView
        android:id="@+id/imageview_animation_list_filling"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/animation_list_filling"
        />
    

    开始动画

    ImageView mImageViewFilling = (ImageView) findViewById(R.id.imageview_animation_list_filling);
    ((AnimationDrawable) mImageViewFilling.getBackground()).start();
    

    【讨论】:

    • 您的代码可以工作,但是,有两个问题 - 1) 淡出过渡没有淡入淡出。 2)一旦设置了每个图像,这将停止更改图像。
    【解决方案2】:

    在xml中创建两个你可以从here获取然后像这样加载它们。

    ImageView myImageView = (ImageView) findViewById(R.id.imageView2); 
    Animation myFadeInAnimation = AnimationUtils.loadAnimation(Splash.this, R.anim.fadein)
    Animation myFadeOutAnimation = AnimationUtils.loadAnimation(Splash.this, R.anim.fadeout);
    
    int value = 0; // Global Type
    btnStart.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    if(value%2 == 0){
                      doFadeOutAnimation();
                     }else{
                      doFadeInAnimation();
                     }
                    value ++;
                }
            });
    

    【讨论】:

      【解决方案3】:

      另一种方法是使用 Android 的 View Animator 类之一,例如 ObjectAnimator。这就是我正在做的事情:

      1) 将要使用的图像的可绘制 ID 添加到 int 数组中。

      2) 为fadeIn 和fadeOut 动画创建ObjectAnimators。您可以根据需要设置淡入和淡出的持续时间。

      3) 将 AnimatorListener 添加到 fadeOut ObjectAnimator,这样当它完成时,它将设置新图像(通过从图像数组中选择一个随机数随机选择),然后它将与新图像一起淡入,使用fadeIn ObjectAnimator。

      4) 创建一个runnable,并在它的run方法中,启动fadeOut动画。

      5) 在可运行对象上调用 handler.postDelayed 并使用它来决定您希望每个图像在淡出之前保留多长时间。

      6) 在 Runnable 的 run 方法结束时,再次调用 handler.postDelayed 以使图像继续淡入淡出,但您应确保有某种条件语句以便可以停止动画当你需要时,这就是为什么我使用布尔“运行”,所以当我需要停止处理程序循环时,我可以将它设置为 false。

      ImageView mImageView = (ImageView) findViewById(R.id.imageView);
      boolean running = true;
      
      final int[] images = {R.drawable.image1, R.drawable.image2, R.drawable.image3,
          R.drawable.image4, R.drawable.image5};
      
      final Random random = new Random();
      final Handler handler = new Handler();
      
      final ObjectAnimator fadeIn = ObjectAnimator.ofFloat(mImageView, "alpha", 0f, 1f);
      fadeIn.setDuration(1000);
      
      final ObjectAnimator fadeOut = ObjectAnimator.ofFloat(mImageView, "alpha", 1f, 0f);
      fadeOut.setDuration(1000);
      fadeOut.addListener(new Animator.AnimatorListener() {
          @Override
          public void onAnimationStart(Animator animation) {
      
          }
      
          @Override
          public void onAnimationEnd(Animator animation) {
              int rand = random.nextInt(images.length);
              mImageView.setImageResource(images[rand]);
              fadeIn.start();
          }
      
          @Override
          public void onAnimationCancel(Animator animation) {
      
          }
      
          @Override
          public void onAnimationRepeat(Animator animation) {
      
          }
      });
      
      
      Runnable runnable = new Runnable() {
          @Override
          public void run() {
              fadeOut.start();
      
              if (running) {
                  handler.postDelayed(this, 5000);
              }
          }
      };
      
      handler.postDelayed(runnable, 5000);
      
      
      }
      

      这将通过淡入/淡出动画连续循环播放您选择的图像(随机)。您可以添加一些检查以确保同一图像不会连续出现两次,等等。

      【讨论】: