(View.INVISIBLE)在Timer.sleep()无效之前

时间:2018-05-26 16:35:05

标签: android timer sleep invisible

我有几个按钮,我想让它们在一段时间内不可见,然后让它们再次变得可见。 Timer.sleep()之前的(View.INVISIBLE)不起作用。我还没弄清楚这一点。有任何想法吗? 谢谢,史蒂夫

private void commonBtnHandler(Button btn) {
    try {
        btn.setVisibility(View.INVISIBLE);
        Thread.sleep(250);
        btn.setVisibility(View.VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

4 个答案:

答案 0 :(得分:0)

您不应该在UI /主线程上执行Thread.sleep()。它会导致用户界面冻结& ANR

尝试:

btn.setVisibility(View.INVISIBLE);
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        btn.setVisibility(View.VISIBLE);
    }
}, 250);

250 ms也是一段非常短的时间。

答案 1 :(得分:0)

 btn.setVisibility(View.INVISIBLE);
     new Thread() {
     public void run() {
            try {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                     btn.setVisibility(View.VISIBLE);
                    }
                });
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
}.start();
当需要在运行时更改UI时,

始终放置runOnUiThread,这对您有所帮助。

答案 2 :(得分:0)

感谢您的所有输入。

我尝试了所有的建议,延迟时间为3000毫秒,但仍然没有看到眨眼。

另外,我想知道我是否阻止了UI线程。我认为INVISIBLE会在sleep()生效之前完成。

总结:我写了一个循环来拨打电话10次。在所有情况下似乎都忽略了延迟。我感谢大家的帮助。看起来我需要重新思考这应该如何运作。我不认为这与游戏程序员如何确保同步操作有很大的不同。

答案 3 :(得分:0)

以另一种方式解决此问题我没有隐藏按钮,而是在setOnTouchListener中使用MotionEvent暂时更改了颜色。按下按钮时,按钮会改变颜色,释放时会恢复原始颜色。效果很好!

    mBtn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch ( event.getAction() ) {
                case MotionEvent.ACTION_DOWN:
                    mBtn.setBackgroundColor(getResources().getColor(R.color.colorLightOrange));
                    break;
                case MotionEvent.ACTION_UP:
                    mBtn.setBackgroundColor(getResources().getColor(R.color.colorOrange));
                    break;
            }
            return true;
        }
    });