android - 重复该过程: displaying a view for an random time then make it invisible for an random time

标签 android handler visibility

标题说明了一切。我想让 View 进入随机可见性和不可见性的无限循环。这就是我的处理方法:-

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

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经历了可见和不可见的无限循环但是将其设置为可见或不可见的时间似乎没有最小值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() 返回 3000,getRandomWaitTime() 返回 3500,您将在 3000 毫秒和 500 毫秒后看到 View 可见,它会再次消失。

您可以通过以下方式更改代码:

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

关于android - 重复该过程: displaying a view for an random time then make it invisible for an random time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397318/

相关文章:

android - 如何在android中将处理程序用作计时器?

css - 将鼠标悬停在其上时显示隐藏的 div I

android - NDK原生代码具体执行在哪里

java - Android Studio - 获取 Activity View 实例的最佳方式

android - 使用 ListFragment 填充自定义 View 列表

android - 在 LooperThread 中获取处理程序返回 null

javascript - 无法读取未定义的属性 'onRowClickHandler'

android - 检测隐藏 fragment 中的 View 可见性

java - 如何通过反射找出方法的可见性?

java - 在 java 中使用 OpenGL ES 创建游戏