Timer.sleep() 之前的 (View.INVISIBLE) 不起作用
Posted
技术标签:
【中文标题】Timer.sleep() 之前的 (View.INVISIBLE) 不起作用【英文标题】:(View.INVISIBLE) before Timer.sleep() not working 【发布时间】:2018-11-05 18:42:47 【问题描述】:我有几个按钮我想暂时不可见,然后再让它们可见。 。我还没有弄清楚。有任何想法吗? 谢谢,史蒂夫
private void commonBtnHandler(Button btn)
try
btn.setVisibility(View.INVISIBLE);
Thread.sleep(250);
btn.setVisibility(View.VISIBLE);
catch (Exception e)
e.printStackTrace();
【问题讨论】:
您如何确定View.INVISIBLE
不起作用?线程仅休眠 250 毫秒。它只是眨眼。
它不起作用,因为您阻塞了 UI 线程,这将使视图不可见。尝试使用Handler.postDelayed()
将btn.setVisibility(View.VISIBLE);
延迟250 毫秒
我认为这已经在Handler
中了。如果不是,那么您的评论是正确的。 .
【参考方案1】:
您不应该在 UI/主线程上执行 Thread.sleep()
。这将导致 UI 冻结 & ANR
试试:
btn.setVisibility(View.INVISIBLE);
new Handler().postDelayed(new Runnable()
@Override
public void run()
btn.setVisibility(View.VISIBLE);
, 250);
另外250 ms
是一个非常小的时间。
【讨论】:
【参考方案2】: 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,这对您有帮助。
【讨论】:
【参考方案3】:感谢大家的意见。
我尝试了所有建议,延迟了 3000 毫秒,但仍然没有看到闪烁。
另外,我想知道我是否阻塞了 UI 线程。我以为 INVISIBLE 会在 sleep() 生效之前完成。
总结:我写了一个循环来调用 10 次。在所有情况下,延迟似乎都被忽略了。我感谢大家的帮助。看来我需要重新考虑这应该如何工作。我认为这与游戏程序员确保同步操作的方式没有太大不同。
【讨论】:
【参考方案4】:以另一种方式解决此问题,我没有隐藏按钮,而是使用 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;
);
【讨论】:
以上是关于Timer.sleep() 之前的 (View.INVISIBLE) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章