在一个时间间隔后如何生成新的随机整数?

时间:2018-07-10 10:57:45

标签: java android random android-animation

我正在尝试使用以下代码为RelativeLayout上的Android Studio设置动画,以通过随机的背景色循环显示:

public static void fadeLayoutColour(RelativeLayout rLayout, long timeMills) {

    // Here are the random values
    int randAlpha = ThreadLocalRandom.current().nextInt(0, 0xff);
    int randRed   = ThreadLocalRandom.current().nextInt(0, 0xff);
    int randGreen = ThreadLocalRandom.current().nextInt(0, 0xff);
    int randBlue  = ThreadLocalRandom.current().nextInt(0, 0xff);
    int randColor = ThreadLocalRandom.current().nextInt(0xff000000, 0xffffffff);

    // The animation
    ObjectAnimator colourFade = ObjectAnimator.ofObject(rLayout,
                                                    "backgroundColor",
                                                    new ArgbEvaluator(),
                                                    Color.argb(randAlpha, randRed, randGreen, randBlue), randColor);
    colourFade.setDuration(timeMills);
    colourFade.setRepeatCount(Animation.INFINITE);
    colourFade.setRepeatMode(ValueAnimator.REVERSE);
    colourFade.start();
}

问题在于此代码选择了随机数,然后在此处停止。

动画有效,但是一旦选择了随机值,它们将保持原样。因此,虽然我希望它可以通过随机的颜色循环,但只能通过两种颜色循环。这意味着我必须不断更新随机值。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我这里没有设置Android项目来尝试一下,但是我会首先尝试一下:

ObjectAnimatorAnimator java.lang.Object ↳ android.animation.Animator ↳ android.animation.ValueAnimator ↳ android.animation.ObjectAnimator

因此,您可以将Animator.AnimationListener添加到ObjectAnimator中。使用其addListener(Animator.AnimatorListener listener)方法。 该侦听器有一个onAnimationEnd()方法,您可以在其中回调fadeLayoutColour方法。那应该重新计算随机值并重新运行动画。

答案 1 :(得分:1)

public static void fadeLayoutColour(RelativeLayout rLayout, long timeMills) {
    final ThreadLocalRandom r = ThreadLocalRandom.current();
    final ObjectAnimator colourFade = ObjectAnimator.ofObject(rLayout, "backgroundColor", new ArgbEvaluator(),
            Color.argb(255, r.nextInt(256), r.nextInt(256), r.nextInt(256)),
            Color.argb(255, r.nextInt(256), r.nextInt(256), r.nextInt(256)));
    colourFade.setDuration(timeMills);
    colourFade.setRepeatCount(Animation.INFINITE);
    colourFade.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {}

        @Override
        public void onAnimationEnd(Animator animation) {}

        @Override
        public void onAnimationCancel(Animator animation) {           }

        @Override
        public void onAnimationRepeat(Animator animation) {
            colourFade.setObjectValues(colourFade.getAnimatedValue(),
                    Color.argb(255, r.nextInt(256), r.nextInt(256), r.nextInt(256)));
        }
    });
    colourFade.start();
}

答案 2 :(得分:0)

有一种代码可以生成随机颜色。

new Color((int)(Math.random() * 0x1000000));

如果不改变工作范围,则可以在上面使用,否则可以使用随机的方法。

int R = (int)(Math.random()*256);
int G = (int)(Math.random()*256);
int B= (int)(Math.random()*256);
Color color = new Color(R, G, B); //random color, but can be bright or dull

//to get rainbow, pastel colors
Random random = new Random();
final float hue = random.nextFloat();
final float saturation = 0.9f;//1.0 for brilliant, 0.0 for dull
final float luminance = 1.0f; //1.0 for brighter, 0.0 for black
color = Color.getHSBColor(hue, saturation, luminance);