You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动