You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修改倒计时计时器示例,实现进度条平滑移动及数字更新

平滑倒计时进度条+数字同步解决方案

我太懂你这种找不到靠谱代码的郁闷了!之前调ProgressBar的max值、缩短CountDownTimer的间隔,确实只能让跳动稍微小一点,没法真正实现丝滑效果。用Animator类是完全正确的方向,下面给你一套完整的实现,既能让进度条平滑移动,又能精准同步倒计时数字:

第一步:调整activity_main.xml布局

先确保你的布局里包含水平样式的ProgressBar和显示倒计时的TextView,示例代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100" /> <!-- 用100作为百分比基准,简化进度计算 -->

    <TextView
        android:id="@+id/tvCountdown"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:layout_marginTop="24dp" />

</LinearLayout>

第二步:编写Java代码实现平滑动画+数字同步

替换原来的CountDownTimer逻辑,用ValueAnimator实现逐帧更新,确保进度条和倒计时数字完美同步:

package com.example.arturo_2.countdowntimertutorial;

import android.animation.ValueAnimator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private ProgressBar progressBar;
    private TextView tvCountdown;
    private ValueAnimator countdownAnimator;
    private static final long COUNTDOWN_DURATION = 10000; // 总倒计时时长,单位:毫秒(示例为10秒)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progressBar);
        tvCountdown = findViewById(R.id.tvCountdown);

        initCountdownAnimator();
        // 启动倒计时动画
        countdownAnimator.start();
    }

    private void initCountdownAnimator() {
        // 创建从总时长到0的数值动画
        countdownAnimator = ValueAnimator.ofFloat(COUNTDOWN_DURATION, 0);
        countdownAnimator.setDuration(COUNTDOWN_DURATION);
        // 设置线性插值器,保证倒计时匀速进行
        countdownAnimator.setInterpolator(new android.view.animation.LinearInterpolator());

        // 动画帧更新回调,同步进度条和数字
        countdownAnimator.addUpdateListener(animation -> {
            float remainingTime = (float) animation.getAnimatedValue();
            // 计算进度百分比:(剩余时间/总时长)*100
            int progress = (int) ((remainingTime / COUNTDOWN_DURATION) * 100);
            progressBar.setProgress(progress);

            // 更新倒计时数字,转换成整数秒数
            long remainingSeconds = (long) (remainingTime / 1000);
            tvCountdown.setText(String.valueOf(remainingSeconds));
        });

        // 动画结束后的收尾处理(可选)
        countdownAnimator.addListener(new android.animation.Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(android.animation.Animator animation) {}

            @Override
            public void onAnimationEnd(android.animation.Animator animation) {
                tvCountdown.setText("倒计时结束");
            }

            @Override
            public void onAnimationCancel(android.animation.Animator animation) {}

            @Override
            public void onAnimationRepeat(android.animation.Animator animation) {}
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 销毁动画避免内存泄漏
        if (countdownAnimator != null) {
            countdownAnimator.cancel();
            countdownAnimator.removeAllListeners();
        }
    }
}

方案优势说明

  • ValueAnimator基于Android动画帧机制更新(默认60帧/秒),进度条会完全平滑移动,彻底解决CountDownTimer固定间隔回调带来的跳动问题
  • 每一次帧更新时同步计算剩余时间和进度百分比,确保数字和进度条的状态100%匹配
  • 线性插值器保证倒计时匀速进行,符合日常使用的直观感受

你之前尝试的增大max值,本质还是依赖CountDownTimer的固定回调间隔,最多只能减小跳动幅度,没法从根本上实现平滑效果。这个Animator方案直接从动画底层逻辑入手,完美解决你的需求~

内容的提问来源于stack exchange,提问作者user4328677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:52:32