Merge #800 into sdk602patch0626 from refs/changes/800/head 803/target/1 804/target/1
author袁清梦 <3449750381@qq.com>
Tue, 27 Aug 2024 07:57:29 +0000 (07:57 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Tue, 27 Aug 2024 07:57:29 +0000 (07:57 +0000)
Code review from 袁清梦

* refs/changes/800/head: (2 commits squashed)

  - 修改呼吸训练UI与设计同步;增加呼吸训练状态改变的震动效果

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/800
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp

index b07fd33..d6cf3dc 100644 (file)
@@ -24,8 +24,8 @@ namespace OHOS
 {
     typedef enum
     {
-        RESPIRATORYTRAINING = 0, 
-        RESPIRATORYTRAININGCOMPLETED,        
+        RESPIRATORYTRAINING = 0,
+        RESPIRATORYTRAININGCOMPLETED,
         MAX_RESPIRATORYTRAININGID,
     } RESPIRATORYTRAININGVIEWID;
 
@@ -50,9 +50,12 @@ namespace OHOS
         int16_t step = -1;
         float scale = 0;
         uint16_t curTime = 0;
+        uint16_t prepareTiem = 0;
         uint16_t durationTime = 5 * 1000; // 5000: means 5000ms
         int16_t startVal = durationTime;
         int16_t endVal = durationTime / 2; // 2: half
+        bool isprepare{false};
+        int prepare_count = 0;
     };
 
     static constexpr int RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X = 193;
@@ -107,7 +110,7 @@ namespace OHOS
         RespiratoryTrainingCallback *RespiratoryTrainingCallBack_ = nullptr;
         Animator *RespiratoryTrainingAnimator_ = nullptr;
         UIImageView *RespiratoryTrainingImg_ = nullptr;
-        //UILabelButton *RespiratoryTrainingStart_ = nullptr;
+        // UILabelButton *RespiratoryTrainingStart_ = nullptr;
         UILabelExt *RespiratoryTrainingStartNote_ = nullptr;
         UILabelExt *RespiratoryTrainingLabel_ = nullptr;
         bool animateStart_ = false;
index 2ab0dfa..1818987 100644 (file)
 #include "respiratorytraining/include/RespiratoryTrainingView.h"
 #include "heartrate/include/HeartModel.h"
 #include <custom_utils.h>
+#include "gfx_utils/mem_check.h"
 namespace OHOS
 {
     // 声明定时器变量
     static osTimerId_t g_timer = NULL;
-    static int Time = 5;
+    static int Time = 0;
     static constexpr int ONE_MINUTE = 60; // 一分钟
     static bool START_FLAG = false;
 
@@ -58,40 +59,25 @@ namespace OHOS
     {
         Time = 5;
         START_FLAG = false;
-        HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测
+        HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测
     }
     /* -------------------------------------------------------------------------- */
     /*定时器到期时的处理*/
     static void RT_TimerCallbackProc(int data)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RT_TimerCallbackProc,Time = %d", Time);
-        Time -= 1;
         RespiratoryTrainingView *p_RespiratoryTrainingView = RespiratoryTrainingView::GetInstance();
         if (p_RespiratoryTrainingView == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RespiratoryTrainingView is nullptr!!");
             return;
         }
-        if (Time <= 0)
-        {
-            if (START_FLAG == true)
-            {
-                RespiratoryTrainingModel::GetInstance().RT_StopTimer();                // 停止定时器
-                RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes(); // 呼吸训练次数加1
-                p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop();  // 关闭呼吸动画
-                HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE);             // 关闭心率检测
-                p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
-                ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);/*取消常亮屏*/
-            }
-            else
-            {
-                Time = ONE_MINUTE;
-                p_RespiratoryTrainingView->StartRespiratoryTraining(); // 开始呼吸训练
-                START_FLAG = true;
-                HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE); // 开启心率检测
-            }
-        }
-
+        RespiratoryTrainingModel::GetInstance().RT_StopTimer();                            // 停止定时器
+        RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes();             // 呼吸训练次数加1
+        p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop();              // 关闭呼吸动画
+        HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测
+        p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
+        ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); /*取消常亮屏*/
         return;
     }
 
index b559e35..04fa4a7 100644 (file)
 #include "animator/easing_equation.h"
 #include "ui_resource_string.h"
 #include "respiratorytraining/include/RespiratoryTrainingModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "vibrator_service.h"
 
 namespace OHOS
 {
 
-    static constexpr uint16_t ONE_SECOND = 1000; // 一秒
+    static constexpr uint16_t ONE_MIN = 60000; // 1分钟
     static RespiratoryTrainingView *g_pRespiratoryTrainingView{nullptr};
 
     RespiratoryTrainingView::RespiratoryTrainingView()
@@ -270,43 +272,52 @@ namespace OHOS
     void RespiratoryTrainingCallback::Callback(UIView *view)
     {
         // 1.计算当前时间与开始时间的差值,用于控制动画的时间。
-        curTime = HALTick::GetInstance().GetTime() - startTimestamp;
-        // 2.判断当前时间是否大于等于训练总时长,若是则进行下一步操作,否则继续进行呼吸动画的变化。
+        uint32_t currentTime = HALTick::GetInstance().GetTime();
+        curTime = currentTime - startTimestamp;
+
+        // 2.判断当前时间是否大于等于训练总时长,若是则进行下一步操作。
         if (curTime >= durationTime)
         {
-            // 计算动画缩放比例,根据呼吸的起始值、结束值、当前时间、总时间和缓动函数 QuadEaseInOut 进行计算。
-            curTime = durationTime;
-            scale =
-                static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
+            prepare_count++;
+            // 计算动画缩放比例
+            scale = static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, durationTime, durationTime)) / durationTime;
+
             // 切换起始值和结束值,更新下一次呼吸的状态。
-            int16_t temp = startVal;
-            startVal = endVal;
-            endVal = temp;
-            startTimestamp = HALTick::GetInstance().GetTime();
-            isBreathIn = !isBreathIn;
-            if (isBreathIn)
-            {
-                // breath->SetText("现在吸气");
-                breath->SetTextId(STR_INHALE_NOW);
-            }
-            else
+            std::swap(startVal, endVal);
+            startTimestamp = currentTime;
+
+            if (prepare_count >= 2)
             {
-                // breath->SetText("现在呼气");
-                breath->SetTextId(STR_EXHALE_NOW);
+                // 只有在准备时间结束后才切换呼吸状态和文本
+                isBreathIn = !isBreathIn;
+                if (isBreathIn)
+                {
+                    // breath->SetText("现在吸气");
+                    breath->SetTextId(STR_INHALE_NOW);
+                }
+                else
+                {
+                    // breath->SetText("现在呼气");
+                    breath->SetTextId(STR_EXHALE_NOW);
+                }
+                // 震动提醒
+                ui_api_vibrate_once_func();
+                breath->ForceResetText();
             }
-            breath->ForceResetText();
         }
         else
         {
-            scale =
-                static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
+            // 继续进行呼吸动画的变化
+            scale = static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
         }
-        // 根据动画步长 step 更新图片的旋转角度 angle,每次旋转完成后将角度重置为 0,实现连续旋转效果。
+
+        // 根据动画步长 step 更新图片的旋转角度 angle
         angle += step;
         if (angle <= -360)
-        { // 360: degrees per cycle
+        {
             angle = 0;
         }
+
         // 根据计算得到的缩放比例 scale 对图片进行缩放操作,并根据角度对图片进行旋转操作
         img_->Scale({scale, scale}, VIEW_CENTER);
         img_->Rotate(angle, VIEW_CENTER);
@@ -374,7 +385,7 @@ namespace OHOS
                 return false;
             }
             RespiratoryTrainingLabel_->SetPosition(53, 320, 360, 70);
-            RespiratoryTrainingLabel_->SetTextId(STR_EXHALE_NOW); // 现在呼气
+            RespiratoryTrainingLabel_->SetTextId(STR_KEEP_STILL_FOCUS_ON_BREATHING); // 准备
             RespiratoryTrainingLabel_->SetStyle(STYLE_TEXT_FONT, 30);
             RespiratoryTrainingLabel_->SetStyle(STYLE_LINE_HEIGHT, 35);
             RespiratoryTrainingLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -428,7 +439,7 @@ namespace OHOS
         RespiratoryTrainingStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
         RespiratoryTrainingStart_->SetOnClickListener(this);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStart_);
-#elif 1
+#else
 
         RespiratoryTrainingStartNote_ = new UILabelExt();
         if (RespiratoryTrainingStartNote_ == nullptr)
@@ -502,7 +513,10 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordListViewInit fail!!");
             return;
         }
-        RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_SECOND);
+        StartRespiratoryTraining();                                                          // 开始呼吸训练
+        HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测
+        RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_MIN);                      // 开启一个一分钟的定时器
+        ui_api_vibrate_once_func();                                                          // 震动提醒
     }
 
     void RespiratoryTrainingView::ClearAll(void)