这是我在这里的第一篇文章,如果我的问题格式不正确,很抱歉。我正在开发我的第一个Android应用程序,它是一个纸牌游戏。我使用Visual Studio在C#中开发了相同的纸牌游戏。在 C# 中,为了模拟处理时的动作和延迟等,我将线程休眠了给定的时间,然后调用了强制 UI 更新的方法 Application.DoEvents()。但是,在java中,我似乎找不到这个问题的答案。
我将从我的 deal() 方法中发布一些代码,我需要延迟这些代码,以便看起来这些牌实际上是在一个圆圈中发牌的,而不是一次全部发牌,因为计算机运行得如此之快:
private void dealHelper() { 手牌 = 裁判.getHumanHand();
//show all cards in rotating order
for(int i=0; i<CARD_COUNT; i++)
{
///////////////////////////////////////////////////////////////////////
// load each card into their appropriate ImageViews and make visible //
///////////////////////////////////////////////////////////////////////
//human player
LoadCard(playerCards.get(i), pCards.getCard(i));
playerCards.get(i).setVisibility(View.VISIBLE);
playerCards.get(i).setPadding(1, 1, 1, 1);
// allow discarded cards to be clickable
discardCardImages.get(i).setPadding(1, 1, 1, 1);
//computer 1
computer1Cards.get(i).setImageResource(R.drawable.cardskin);
computer1Cards.get(i).setVisibility(View.VISIBLE);
//computer 2
computer2Cards.get(i).setImageResource(R.drawable.cardskin);
computer2Cards.get(i).setVisibility(View.VISIBLE);
//computer 3
computer3Cards.get(i).setImageResource(R.drawable.cardskin);
computer3Cards.get(i).setVisibility(View.VISIBLE);
}
}
我需要在屏幕上显示的每张卡之间有大约 500 毫秒的轻微延迟来模拟动作。我已经搜索了又搜索,但没有有效的解决方案(或者我理解)。任何帮助将不胜感激。
谢谢丹尼尔
使用带有 Runnable 的处理程序(它在其 run() 中执行循环的一次迭代)并postDelayed(Runnable r, long delayMillis)
延迟。 计算迭代次数,以便您知道何时停止并使用最后一个迭代进行removeCallbacks()
,并在处理完成后调用一个方法来执行任何需要做的事情。
类似的东西
private final Handler mHandler = new Handler();
private int iLoopCount = 0;
private final Runnable rDealAndWait = new Runnable()
{
public void run()
{
if (dealtAHand())
{
++iLoopCount;
mHandler.postAtTime(this, SystemClock.uptimeMillis() + DEAL_DELAY);
}
else
{
doAfterAllHandsDealt();
}
}
};
private boolean dealtAHand()
{
if (i == CARD_COUNT) return false;
//human player
LoadCard(playerCards.get(iLoopCount), pCards.getCard(i));
playerCards.get(iLoopCount).setVisibility(View.VISIBLE);
playerCards.get(iLoopCount).setPadding(1, 1, 1, 1);
// etc
return true;
}
然后在创建或任何地方
dealtAHand();
mHandler.postAtTime(rDealAndWait, SystemClock.uptimeMillis() + DEAL_DELAY);
}
试试Thread.sleep(long millis)
. 你必须把它放在一个尝试/捕获块中。
如果上述解决方案对您没有任何帮助,请尝试在此处使用CountDownTimer,
http://developer.android.com/reference/android/os/CountDownTimer.html
请在这里查看我的答案,它可能会对您有所帮助。 不知道它的正确方式,但它对我很好。
@Override
public void run() {
for(int i = 0;i<diceNum;i++){
runOnUiThread(new Runnable() {
@Override
public void run() {
//do your Ui task here
}
});
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}