【问题标题】:Repeating the process : displaying a view for an random time then make it invisible for an random time重复该过程:显示一个视图随机时间然后使其不可见随机时间
【发布时间】:2017-05-14 19:38:50
【问题描述】:

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

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

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

现在我创建了一个 ImageView 水果 [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 经历了可见性和不可见性的无限循环但设置为可见或不可见的时间似乎没有最小值 3000 毫秒有时感觉它在 500 毫秒内可见,然后就消失了。我尝试了很多方法,例如使用 Handler.postDelayed 而不是 View.postDelayed 但这似乎不起作用。

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

活动开始。首先fruit[0] 设置为不可见。 3000 毫秒后,它会出现并停留在那里。之后什么也没有发生。不再切换到隐形。我只是呆在那里。

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

【问题讨论】:

  • fruit[0] 是View 的一种类型,对吧?
  • 是的。这是一个 ImageView
  • 好的,看看我的答案,它在一个按钮上进行了测试。

标签: android handler visibility


【解决方案1】:

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

【讨论】:

    【解决方案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());
    

    【讨论】:

    • 使用递归,现在一切都像魅力一样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2017-06-07
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多