重复该过程:显示随机时间的视图,然后使其在随机时间内不可见

时间:2016-12-30 13:46:02

标签: android handler visibility

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

首先,我创建了两个方法来获取随机时间getRandomWaitTime()和getRandomDisplayTime()。这些方法已经过很好的定义和测试(在Log中)并且可以根据需要运行。这两种方法都以毫秒为单位返回一个随机值为

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的常量时,会发生有趣的事情。

活动开始。起初,水果[0]被设置为不可见。在3000ms之后它变得可见并且保持在那里。之后没有任何事情发生。不再转向隐形。我只是呆在那里。

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

2 个答案:

答案 0 :(得分:2)

重点是,在第一次之后 你打电话给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()返回3000和getRandomWaitTime()返回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());

答案 1 :(得分:2)

你的代码有点乱,试试这个例子。根据视图本身,将选择值而不是嵌套的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());