重复该过程:随机显示一个视图,然后随机使其不可见

Repeating the process : displaying a view for an random time then make it invisible for an random time

标题说明了一切。我想查看随机可见性和不可见性的无限循环。这就是我处理它的方式:-

首先我创建了两个方法来获取随机时间getRandomWaitTime() 和getRandomDisplayTime()。这些方法已明确定义和测试(在 Log 中)并且按预期工作。这两种方法 return 以毫秒为单位的随机值作为

getRandomWaitTime()     :   3000-6000
getRandomDisplayTime()  :   3000-5000

现在我创建了一个 ImageView fruit[0],最初将其设置为不可见,然后执行以下代码:

fruit[0].postDelayed(new Runnable() {
            @Override
            public void run() {
                fruit[0].setVisibility(View.VISIBLE);
                fruit[0].postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        fruit[0].setVisibility(View.INVISIBLE);
                    }
                }, getRandomDisplayTime());
                fruit[0].postDelayed(this, getRandomWaitTime());
                }
        }, getRandomWaitTime()); 

代码也编译执行,ImageView无限循环可见和不可见但是设置可见或不可见的时间似乎没有最小值3000ms 有时感觉它在 500 毫秒内可见,然后就消失了。我已经尝试了很多东西,例如使用 Handler.postDelayed 而不是 View.postDelayed 但这似乎不起作用。

当我从 postDelayed 方法中删除所有 getRandomWaitTime()getRandomDisplayTime() 方法并将其替换为 3000 之类的常量时,有趣的事情发生了。

activity开始。起初 fruit[0] 被设置为不可见。 3000 毫秒后,它变得可见并停留在那里。之后什么也没有发生。不再切换到隐身状态。我就呆在那里。

那么所有这些巫术问题的可能原因是什么?

重点是,在第一个之后 你打电话给 fruit[0].setVisibility(View.VISIBLE);:

fruit[0].postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        fruit[0].setVisibility(View.INVISIBLE);
                    }
                }, getRandomDisplayTime());

和:

fruit[0].postDelayed(this, getRandomWaitTime());

几乎同时(立即)执行。

因此,假设 getRandomDisplayTime() return 3000 和 getRandomWaitTime() returns 3500,您将在 3000 毫秒和 500 毫秒后看到视图更多,它会再次消失。

您可以这样更改您的代码:

fruit[0].postDelayed(new Runnable() {
            @Override
            public void run() {
                final Runnable runnable = this;
                fruit[0].setVisibility(View.VISIBLE);
                fruit[0].postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        fruit[0].setVisibility(View.INVISIBLE);
                        fruit[0].postDelayed(runnable, getRandomWaitTime());
                    }
                }, getRandomDisplayTime());
            }
        }, getRandomWaitTime());

你的代码有点乱,试试这个例子。基于视图本身,将选择值而不是嵌套的 postDelayed() 方法。

fruit[0].postDelayed(new Runnable() {
    @Override
    public void run() {
        fruit[0].setVisibility(backButton.getVisibility() == View.VISIBLE ? View.INVISIBLE : View.VISIBLE);
        fruit[0].postDelayed(this, backButton.getVisibility() == View.VISIBLE ? getRandomDisplayTime() : getRandomWaitTime());
    }
}, fruit[0].getVisibility() == View.VISIBLE ? getRandomDisplayTime() : getRandomWaitTime());