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

How can I generate new random integers after a time interval?

我正在尝试使用以下代码为 RelativeLayoutAndroid 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();
}

问题是此代码选择了随机数并停在那里。

动画有效,但一旦选择了随机值,它们就会保持原样。因此只循环使用两种颜色,尽管我希望它循环使用随机颜色。这意味着我必须不断更新随机值。

我该怎么做?

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

ObjectAnimator 是一个 Animator java.lang.Object ↳ android.animation.Animator ↳ android.animation.ValueAnimator ↳ android.animation.ObjectAnimator

所以你或许可以添加一个 Animator.AnimationListener to your ObjectAnimator. Using its addListener(Animator.AnimatorListener listener) 方法。 这个侦听器有一个 onAnimationEnd() 方法,您可以在其中回调 fadeLayoutColour 方法。那应该重新计算随机值并重新运行动画。

有一行代码生成随机颜色。

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