From 7665a9412992a9a293c8651c60f7c74ca68f3dbc Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Tue, 27 Aug 2024 07:57:29 +0000 Subject: [PATCH] Merge #800 into sdk602patch0626 from refs/changes/800/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/800/head: (2 commits squashed) - 修改呼吸训练UI与设计同步;增加呼吸训练状态改变的震动效果 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/800 --- .../include/RespiratoryTrainingView.h | 9 ++- .../src/RespiratoryTrainingModel.cpp | 32 +++------ .../src/RespiratoryTrainingView.cpp | 70 +++++++++++-------- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h index b07fd33bf..d6cf3dcaa 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h @@ -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; diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp index 2ab0dfa59..1818987f4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp @@ -15,11 +15,12 @@ #include "respiratorytraining/include/RespiratoryTrainingView.h" #include "heartrate/include/HeartModel.h" #include +#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; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp index b559e35c2..04fa4a729 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp @@ -13,11 +13,13 @@ #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(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime; + prepare_count++; + // 计算动画缩放比例 + scale = static_cast(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(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime; + // 继续进行呼吸动画的变化 + scale = static_cast(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) -- 2.17.1