Android Studio骰子游戏:点击按钮先播动画再显示随机骰子问题
解决AnimationDrawable播放后直接执行后续逻辑的问题
嘿,我完全懂你的困扰!你现在的问题在于AnimationDrawable是异步播放的——当你调用animationDice.start()后,代码会立刻继续执行后面的rollDice方法,根本不等动画播放完毕,所以看起来像是动画被跳过了。
咱们有个简单直接的解决方案,利用Handler.postDelayed()来延迟执行骰子逻辑,等动画完全播放完再触发。
步骤1:计算动画总时长
你的动画有6帧,每帧200ms,总时长就是 6 * 200 = 1200ms,这个数值要和你的animation.xml里的配置对应上。
步骤2:修改点击事件代码
把骰子相关的逻辑放到延迟任务里,确保动画播放完再执行:
rollButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 启动骰子滚动动画 animationDice.start(); // 动画总时长(和animation.xml的配置保持一致) long totalAnimationTime = 6 * 200; // 延迟执行骰子逻辑 new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { // 这里放原来的骰子生成和分数更新逻辑 playerScoreInt = rollDice(diceRoll1ImageViewPLAYER, diceRoll2ImageViewPLAYER); playerScore.setText(Integer.toString(playerScoreInt)); cpuScoreInt = rollDice(diceRoll1ImageViewCPU, diceRoll2ImageViewCPU); cpuScore.setText(Integer.toString(cpuScoreInt)); winnerChecker(); } }, totalAnimationTime); } });
额外提醒
- 如果后续你修改了
animation.xml里的帧数或单帧时长,记得同步更新totalAnimationTime的数值哦。 - 确保你已经正确初始化了
animationDice:// 假设你的骰子ImageView是diceImageView ImageView diceImageView = findViewById(R.id.dice_image_view); diceImageView.setBackgroundResource(R.drawable.animation); AnimationDrawable animationDice = (AnimationDrawable) diceImageView.getBackground();
这样修改后,点击按钮就会先完整播放骰子滚动动画,再显示随机生成的骰子结果啦!
内容的提问来源于stack exchange,提问作者Lucifer




