如何使imageView随机改变背景?

时间:2016-07-13 16:39:25

标签: android background-image android-imageview effects

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

3 个答案:

答案 0 :(得分:0)

您可以使用Android中的帧动画来更改ImageView的背景。

<强>动画-列表

动画列表是首选的默认帧动画,因为它是在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。将以下代码放在您选择的布局中,并将其放入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 :(得分:0)

在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 ++;
            }
        });

答案 2 :(得分:0)

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

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

2)为fadeIn和fadeOut动画创建ObjectAnimators。您可以设置淡入的持续时间并淡出为您想要的任何内容。

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

4)创建一个runnable并在其运行方法中,启动fadeOut动画。

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

6)在Runnable的run方法结束时,再次调用handler.postDelayed以使图像继续淡入淡出,但是你应该确保你有某种条件语句让你可以在需要时停止动画,这就是为什么我使用布尔&#34;运行&#34;所以当我需要停止处理程序循环时,我可以将其设置为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);


}

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