优化倒计时校准
authorCaisking <Casiking@zhihuishixun.com>
Tue, 10 Mar 2026 06:58:38 +0000 (14:58 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Tue, 10 Mar 2026 06:58:38 +0000 (14:58 +0800)
code/sdk/application/wearable/fd272/nativeapp/nativeui/countdown/include/CountDownModel.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/countdown/src/CountDownModel.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp

index 41c1aa3..070b942 100644 (file)
@@ -115,13 +115,13 @@ namespace OHOS
         bool GetisPaused(void) const {\r
             return isPaused;\r
         }\r
-        uint32_t get_current_time();//获取当前系统时间戳\r
+        uint32_t get_current_time(); // 获取当前系统时间戳(ms)\r
     public:\r
         static int g_CountDownTimes;\r
         static int totalSeconds;    //要到计时总秒数\r
-        static uint32_t startTime;  //开始时间戳\r
-        static uint32_t pauseTime;  //暂停时间戳\r
-        static uint32_t endTime;    //结束时间戳\r
+        static uint32_t startTime;  // 开始时间戳(ms)\r
+        static uint32_t pauseTime;  // 暂停时间戳(ms)\r
+        static uint32_t endTime;    // 结束时间戳(ms)\r
 \r
     private:\r
         CountDownModel() {}\r
index 226a9c0..fcae7c2 100644 (file)
@@ -26,7 +26,7 @@ namespace OHOS
         COUNTDOWN_MAX,\r
     } CountDownViewId;\r
 \r
-    static constexpr const int COUNTDOWN_TIMER_DURATION = 1000; // 计时器的定时器周期\r
+    static constexpr const int COUNTDOWN_TIMER_DURATION = 500; // 计时器的定时器周期(ms)\r
     class MainCountDownView;\r
     class MainCountDownPresenter : public Presenter<MainCountDownView>,\r
                                    public UIView::OnClickListener,\r
index f339f15..69d9c59 100644 (file)
@@ -459,22 +459,25 @@ namespace OHOS
         bool isRunning = CountDownModel::GetInstance()->GetisRunning();\r
         bool isPaused = CountDownModel::GetInstance()->GetisPaused();\r
 \r
-        if (isRunning &&!isPaused) \r
+        if (isRunning && !isPaused) \r
         {\r
-            uint32_t currentTime =  CountDownModel::GetInstance()->get_current_time();\r
-            CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime);\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes);\r
-            if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) {\r
+            uint32_t currentTime = CountDownModel::GetInstance()->get_current_time();\r
+            if (currentTime >= CountDownModel::endTime) {\r
+                CountDownModel::g_CountDownTimes = 0;\r
                 // 这里可以添加倒计时结束后的操作,比如发出提示音等\r
                 GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data));\r
+                return;\r
             }\r
+            uint32_t remainingMs = CountDownModel::endTime - currentTime;\r
+            CountDownModel::g_CountDownTimes = static_cast<int32_t>((remainingMs + 999) / 1000); // ceil to seconds\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳(ms):%u,倒计时剩余时间(s):%d", currentTime, CountDownModel::g_CountDownTimes);\r
         }\r
     }\r
 \r
     uint32_t CountDownModel::get_current_time()\r
     {\r
         uint32_t time;\r
-        if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {\r
+        if (uapi_get_timestampe_ms(&time) != ERRCODE_SUCC) {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");\r
             return 0;\r
         }\r
@@ -487,8 +490,8 @@ namespace OHOS
         isPaused = false;\r
         CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes;\r
         CountDownModel::startTime = get_current_time();         //获取开始时间戳\r
-        CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime);\r
+        CountDownModel::endTime = CountDownModel::startTime + static_cast<uint32_t>(g_CountDownTimes) * 1000; //获取结束时间戳(ms)\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime(ms):%u,endTime(ms):%u",CountDownModel::startTime,CountDownModel::endTime);\r
 \r
     }\r
     \r
@@ -506,8 +509,14 @@ namespace OHOS
             uint32_t currentTime = get_current_time();\r
             uint32_t pauseDuration = currentTime - CountDownModel::pauseTime;\r
             CountDownModel::endTime = CountDownModel::endTime + pauseDuration;\r
-            CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration + 1;\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime);\r
+            if (currentTime >= CountDownModel::endTime) {\r
+                CountDownModel::g_CountDownTimes = 0;\r
+            } else {\r
+                uint32_t remainingMs = CountDownModel::endTime - currentTime;\r
+                CountDownModel::g_CountDownTimes = static_cast<int32_t>((remainingMs + 999) / 1000); // ceil to seconds\r
+            }\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime(ms):%u,pauseDuration(ms):%u,endTime(ms):%u",\r
+                CountDownModel::startTime, pauseDuration, CountDownModel::endTime);\r
         }\r
     }\r
     \r
index ba3ceb2..639caad 100644 (file)
@@ -269,6 +269,10 @@ namespace OHOS
             p_CountDownModel->SetCountDownTimerIsPause(false);\r
             p_CountDownModel->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION);\r
             p_CountDownModel->CountDown_ResumeTimer(COUNTDOWN_TIMER_DURATION);\r
+            if (p_StartCountDownView->GetShowCountDownTimelabel()) {\r
+                p_StartCountDownView->GetShowCountDownTimelabel()->SetText(\r
+                    CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+            }\r
             /*视图恢复*/\r
             p_StartCountDownView->SetImageAndLabel(true);\r
             p_StartCountDownView->ShowEndView(false);\r