From 234e6baca005ce635ff8c6a58e72e4406fba655d Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Sat, 7 Sep 2024 19:32:13 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E7=9C=81=E7=94=B5=E6=A8=A1?= =?utf8?q?=E5=BC=8F=E9=80=80=E5=87=BA=E5=8A=A8=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../saveele/include/SaveBatPresenter.h | 12 +- .../nativeui/saveele/include/SaveBatView.h | 55 ++- .../nativeui/saveele/include/SaveEleModel.h | 21 +- .../nativeui/saveele/src/SaveBatPresenter.cpp | 68 +-- .../nativeui/saveele/src/SaveBatView.cpp | 420 ++++++++++++++++-- 5 files changed, 479 insertions(+), 97 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatPresenter.h index 2c7743d92..5d60a82f4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatPresenter.h @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-04-15 10:55:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-06 17:43:45 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatPresenter.h + */ #ifndef _SAVEBAT_PRESENTER_H #define _SAVEBAT_PRESENTER_H @@ -40,14 +46,10 @@ namespace OHOS void Refresh_Back_View(); private: - // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; - bool OnClick(UIView &view, const ClickEvent &event) override; - bool OnDrag(UIView &view, const DragEvent &event) override; - bool OnLongPress(UIView &view, const LongPressEvent &event); bool OnPress(UIView &view, const PressEvent &event); bool OnRelease(UIView &view, const ReleaseEvent &event); bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 - + uint64_t startTime{0}; int count = 3; // 初始计数 int progressValue = 0; // 初始进度值 diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatView.h b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatView.h index dac8f1db9..668f09ceb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveBatView.h @@ -28,9 +28,50 @@ #include "SaveBatPresenter.h" #include - +#include "components/ui_canvas.h" +#include "components/ui_scroll_view.h" +#include "components/ui_canvas_ext.h" +#include "components/ui_label_button.h" +#include "hal_tick.h" namespace OHOS { + enum class countStage + { + STAGE_GRADUAL_CIRCLE = 0, + STAGE_COUNTING_DOWN, + STAGE_FADE_OUT, + STAGE_NONE + }; + class CountdownBackAnimatorCallback : public AnimatorCallback + { + public: + explicit CountdownBackAnimatorCallback(UICanvasExt *canvas) : canvas_(canvas) {} + ~CountdownBackAnimatorCallback() override {} + void Callback(UIView *view) override; + void NotifyStart(); + void CancelCountdown(); + void SetInfo(UILabel *label, int counts); + + private: + void CountingDown(); + void UpdatePath(int16_t start, int16_t end, bool needDrawCircle); + void UpdateLable(uint32_t curTime); + void CircleFadeOut(); + void GradualCircle(); + UICanvasExt *canvas_ = nullptr; + UILabel *label_ = nullptr; + bool updateText_ = false; + bool firstArc_ = false; + countStage stage_ = countStage::STAGE_NONE; + int16_t endAngle_ = 0; + int16_t easeDegree_ = 0; + uint16_t idleTime_ = 0; + int16_t counts_ = 0; + uint32_t lastTime_ = 0; + uint32_t degreePerSecond_ = 0; + uint32_t surplusDegree = 0; + }; + class SaveBatPresenter; class SaveBatView : public View { @@ -58,7 +99,8 @@ namespace OHOS void InitShowBackView(); void UpdateView(); - + void StartCanvas(); + void StopCanvas(); UILabel *GetCountlabel() { return countlabel; @@ -67,6 +109,7 @@ namespace OHOS { return backprogress; } + private: UIView::OnDragListener *draglistener{nullptr}; @@ -84,7 +127,13 @@ namespace OHOS UILabel *countlabel{nullptr}; UIImageView *wathchiamge{nullptr}; UICircleProgress *backprogress{nullptr}; - + /*test*/ + CountdownBackAnimatorCallback *callBack_ = nullptr; + Animator *CountdownBackAnimator_ = nullptr; + UICanvasExt *canvas_ = nullptr; + UILabelButton *restart_ = nullptr; + UIViewGroup *container_ = nullptr; + UILabel *label_ = nullptr; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveEleModel.h b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveEleModel.h index 022731b58..9ed43c922 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveEleModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveEleModel.h @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-08-21 16:18:26 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-06 18:19:25 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/saveele/include/SaveEleModel.h + */ #ifndef SAVE_ELE_MODEL_H #define SAVE_ELE_MODEL_H @@ -11,16 +17,16 @@ namespace OHOS // 获取充电状态 bool GetChargeStatus(); - - // 设置充电状态 void SetChargeStatus(bool chargeStatus); - // 获取视图状态 - bool GetViewState() const { return viewState; } - // 设置视图状态 + bool GetViewState() const { return viewState; } void SetViewState(bool state) { viewState = state; } + // 设置退出状态 + bool GetBackState() const { return backStatus_; } + void SetBackState(bool state) { backStatus_ = state; } + private: SaveEleModel() = default; // 默认构造函数 ~SaveEleModel() {} // 默认析构函数 @@ -28,8 +34,9 @@ namespace OHOS SaveEleModel(const SaveEleModel &) = delete; // 禁止拷贝构造 SaveEleModel &operator=(const SaveEleModel &) = delete; // 禁止赋值操作 - bool chargeStatus_{nullptr}; // 充电状态 - bool viewState{false}; // 视图状态 + bool chargeStatus_{false}; // 充电状态 + bool backStatus_{false}; // 退出状态 + bool viewState{false}; // 视图状态 }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatPresenter.cpp index abb384891..c65dbcc93 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatPresenter.cpp @@ -63,7 +63,6 @@ namespace OHOS void SaveBatPresenter::OnStart() { - SaveEleModel::GetInstance()->SetChargeStatus(false); Presenter::OnStart(); } @@ -83,48 +82,16 @@ namespace OHOS Presenter::OnStop(); } - bool SaveBatPresenter::OnDrag(UIView &view, const DragEvent &event) - { - UNUSED(view); - return true; - } - - bool SaveBatPresenter::OnClick(UIView &view, const ClickEvent &event) - { - if (strcmp(view.GetViewId(), "button_exit") == 0) - { - /*点击*/ - bool state = SaveEleModel::GetInstance()->GetViewState(); - SaveEleModel::GetInstance()->SetViewState(!state); - SaveBatView::GetInstance()->UpdateView(); - } - return true; - } - bool SaveBatPresenter::OnLongPress(UIView &view, const LongPressEvent &event) - { - if (strcmp(view.GetViewId(), "button_exit") == 0) - { - NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); - } - return true; - } bool SaveBatPresenter::OnPress(UIView &view, const PressEvent &event) { if (strcmp(view.GetViewId(), "button_exit") == 0) { - /* - uint64_t current_time = osKernelGetTick2ms(); - SaveBatView::GetInstance()->Refresh_Back_View(); - if (IS_TIME_EXCEED(startTime, current_time)) - { - NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); - } - */ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进行按下"); if (SaveEleModel::GetInstance()->GetViewState() == false) { SaveEleModel::GetInstance()->SetViewState(true); SaveBatView::GetInstance()->UpdateView(); - ResetTickTimer(); + SaveBatView::GetInstance()->StartCanvas(); } } return true; @@ -133,37 +100,36 @@ namespace OHOS { if (strcmp(view.GetViewId(), "button_exit") == 0) { - /*释放*/ - SaveEleModel::GetInstance()->SetViewState(false); - SaveBatView::GetInstance()->UpdateView(); - /*重置*/ - progressValue = 0; - count = 3; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进行松开"); + if (SaveEleModel::GetInstance()->GetViewState() == true) + { + SaveBatView::GetInstance()->StopCanvas(); + SaveEleModel::GetInstance()->SetViewState(false); + SaveBatView::GetInstance()->UpdateView(); + } } return true; } void SaveBatPresenter::ExitView(void) { - bool isCharging = SaveEleModel::GetInstance()->GetChargeStatus(); // 获取充电状态 - // 如果省电模式中发生充电变化->进行退出 - if (isCharging) - { - NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); - } + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); } void SaveBatPresenter::OnTickEvent() { - uint64_t current_time = osKernelGetTick2ms(); /*省电表盘界面*/ if (SaveEleModel::GetInstance()->GetViewState() == false) { SaveBatView::GetInstance()->Refresh_Dial_View(); - ExitView(); } - else if (SaveEleModel::GetInstance()->GetViewState() == true) + /*退出判断*/ + bool chargeStatus = SaveEleModel::GetInstance()->GetChargeStatus(); + bool backState = SaveEleModel::GetInstance()->GetBackState(); + if (chargeStatus || backState) { - Refresh_Back_View(); + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "退出省电模式 Charge_Status: %d, Back_State: %d", chargeStatus, backState); + SaveEleModel::GetInstance()->SetBackState(false); + ExitView(); } } void SaveBatPresenter::ResetTickTimer(void) diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp index 8649db8a3..ab235bafe 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp @@ -15,6 +15,7 @@ #include "custom_utils.h" #include "UiConfig.h" #include "wearable_log.h" +#define ANIMATION_TEST 0 extern "C" { void uapi_exit_power_saving_mode(void); @@ -30,12 +31,294 @@ static constexpr const char *SAVE_WATHCH = "/user/res/Save_Ele/wathch.bin"; namespace OHOS { + /*动画类实现*/ + const static int16_t CENTER_X = 233; + const static int16_t CENTER_Y = 233; + const static int16_t LABEL_X = 140; + const static int16_t LABEL_Y = 170; + const static int16_t RADIUS = 90; // 半径 90 + const static int16_t STROKE_WIDTH = 20; + const static int16_t CIRCLE_BASE_WIDTH = 4; + const static uint32_t LIGHT_GREEN = 0xff007700; + static const uint16_t LABEL_FONT_SIZE = 80; + static const uint16_t ANIMATE_TIME = 500; + static const uint16_t SECOND_TO_MINISECOND = 1000; + static const uint16_t CIRCLE_FADE_OUT = 200; + static const uint16_t DEGREES_PER_CIRCLE = 360; + void CountdownBackAnimatorCallback::Callback(UIView *view) + { + // 根据当前阶段调用相应的功能,控制动画状态 + switch (stage_) + { + case countStage::STAGE_GRADUAL_CIRCLE: + { + // 处理渐变圆圈绘制 + GradualCircle(); + break; + } + case countStage::STAGE_COUNTING_DOWN: + { + // 处理倒计时逻辑 + CountingDown(); + break; + } + case countStage::STAGE_FADE_OUT: + { + // 处理圆圈淡出效果 + CircleFadeOut(); + break; + } + default: + break; + } + } + + void CountdownBackAnimatorCallback::CircleFadeOut() + { + // 计算当前时间与上次更新时间的差值 + uint32_t diffTime = HALTick::GetInstance().GetTime() - lastTime_; + + // 如果尚未达到空闲时间,则什么也不做 + if (diffTime < idleTime_) + { + return; + } + + // 清空画布以准备绘制 + canvas_->Clear(); + + // 计算当前的圆圈宽度 + uint32_t curTime = diffTime - idleTime_; + uint16_t width; + + // 判断是否已经达到淡出持续时间 + if (curTime >= CIRCLE_FADE_OUT) + { + curTime = CIRCLE_FADE_OUT; // 限制为最大淡出时间 + stage_ = countStage::STAGE_NONE; // 设置为无状态 + } + + // 使用缓动方程计算当前宽度 + width = EasingEquation::QuadEaseInOut(STROKE_WIDTH, CIRCLE_BASE_WIDTH, curTime, CIRCLE_FADE_OUT); + + // 绘制中心圆圈 + Point center = {CENTER_X, CENTER_Y}; + ColorType lightGreen; + lightGreen.full = LIGHT_GREEN; + PaintExt paint; + paint.SetStyle(Paint::PaintStyle::STROKE_STYLE); + paint.SetCapType(CAP_ROUND); + paint.SetAntialiased(true); + paint.SetStrokeColor(lightGreen); + paint.SetStrokeWidth(width); + canvas_->DrawCircle(center, RADIUS, paint); + + // 更新标签的字体大小和透明度 + uint16_t fontSize = LABEL_FONT_SIZE * width / STROKE_WIDTH; // 根据笔画宽度调整字体大小 + uint16_t opa = OPA_OPAQUE * width / STROKE_WIDTH; // 根据笔画宽度调整透明度 + if (stage_ == countStage::STAGE_NONE) + { + opa = OPA_TRANSPARENT; // 如果处于无状态,设置为完全透明 + } + + label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, fontSize); + label_->SetStyle(STYLE_TEXT_OPA, opa); // 更新标签样式 + } + + void CountdownBackAnimatorCallback::UpdateLable(uint32_t curTime) + { + char buf[2] = {0}; // 字符缓冲区,用于格式化标签文本 + uint16_t fontSize; // 字体大小 + uint16_t opa; // 透明度 + + // 前半段动画,字体逐渐变小 + if (curTime < ANIMATE_TIME / 2) + { + fontSize = LABEL_FONT_SIZE - LABEL_FONT_SIZE * curTime * 2 / ANIMATE_TIME; // 计算当前字体大小 + opa = OPA_OPAQUE * fontSize / LABEL_FONT_SIZE; // 计算当前透明度 + if (firstArc_) + { + fontSize = fontSize / 2; // 如果是第一弧,字体设置为一半大小 + } + } + else + { + // 后半段动画,字体逐渐增大 + fontSize = LABEL_FONT_SIZE * curTime * 2 / ANIMATE_TIME - LABEL_FONT_SIZE; + opa = OPA_OPAQUE * fontSize / LABEL_FONT_SIZE; + + // 更新标签文本 + if (updateText_) + { + if (sprintf_s(buf, sizeof(buf), "%u", (endAngle_ + easeDegree_) / degreePerSecond_) < 0) + { + return; // 如果 sprintf_s 出错,返回 + } + label_->SetText(buf); // 设置标签文本为当前倒计时数字 + updateText_ = false; // 更新文本之后将标志置为false + } + } + + // 更新标签的字体和样式 + label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, fontSize); + label_->SetStyle(STYLE_TEXT_OPA, opa); + } + + void CountdownBackAnimatorCallback::UpdatePath(int16_t start, int16_t end, bool needDrawCircle) + { + // 计算绘制的圆心和颜色 + Point center = {CENTER_X, CENTER_Y}; + ColorType lightGreen; + lightGreen.full = LIGHT_GREEN; + PaintExt paint; + paint.SetStyle(Paint::PaintStyle::STROKE_STYLE); + paint.SetStrokeWidth(STROKE_WIDTH); + paint.SetCapType(CAP_ROUND); + paint.SetAntialiased(true); + paint.SetStrokeColor(lightGreen); + + // 清空画布 + canvas_->Clear(); + // 如果需要绘制基础圆圈,则绘制 + if (needDrawCircle) + { + canvas_->DrawCircle(center, RADIUS, paint); + } + + // 如果起始角度与结束角度不相同,则绘制弧线 + if (start != end) + { + paint.SetStrokeColor(Color::Green()); // 设置弧线颜色为绿色 + // 如果起始角和结束角相差完整的一圈,则绘制完整的圆圈 + if (end - start == DEGREES_PER_CIRCLE) + { + canvas_->DrawCircle(center, RADIUS, paint); + } + else + { + // 绘制从起始角到结束角 + // 绘制从起始角到结束角的弧线 + canvas_->DrawArc(center, RADIUS, start, end, paint); + } + } + } + + void CountdownBackAnimatorCallback::CountingDown() + { + // 计算当前时间与上次更新时间的差值 + uint32_t diffTime = HALTick::GetInstance().GetTime() - lastTime_; + + // 如果时间差达到1秒,则更新倒计时 + if (diffTime >= SECOND_TO_MINISECOND) + { + lastTime_ = HALTick::GetInstance().GetTime(); // 更新最后时间 + // 判断是否是第一次绘制弧线 + if (endAngle_ == DEGREES_PER_CIRCLE) + { + firstArc_ = true; // 如果是第一次,设置标志 + } + else + { + firstArc_ = false; // 否则,设置为非第一次 + } + // 更新路径和标签 + UpdatePath(0, endAngle_, true); + UpdateLable(0); + + // 如果倒计时结束,切换到淡出阶段 + if (endAngle_ == 0) + { + stage_ = countStage::STAGE_FADE_OUT; + idleTime_ = SECOND_TO_MINISECOND - CIRCLE_FADE_OUT; // 设置空闲时间 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "倒计时结束"); + OHOS::SaveEleModel::GetInstance()->SetBackState(true); // 进行界面弹出 + return; + } + + // 更新结束角度和缓动角度 + easeDegree_ = degreePerSecond_; + endAngle_ -= degreePerSecond_; // 减少结束角度 + // 如果结束角度小于等于剩余角度,则重置结束角度 + if (endAngle_ <= surplusDegree) + { + endAngle_ = 0; + easeDegree_ += surplusDegree; // 增加缓动角度 + } + updateText_ = true; // 标记需要更新文本 + } + else if (diffTime >= idleTime_) + { + // 如果时间差超过空闲时间,更新路径和标签 + uint32_t curTime = diffTime - idleTime_; + int16_t arcCurr = EasingEquation::QuadEaseInOut(0, easeDegree_, curTime, ANIMATE_TIME); + UpdatePath(0, endAngle_ + easeDegree_ - arcCurr, true); + UpdateLable(curTime); + } + } + + void CountdownBackAnimatorCallback::GradualCircle() + { + // 计算当前时间与上次更新时间的差值 + uint32_t diffTime = HALTick::GetInstance().GetTime() - lastTime_; + + // 如果时间差达到1秒,则切换到倒计时阶段 + if (diffTime >= SECOND_TO_MINISECOND) + { + stage_ = countStage::STAGE_COUNTING_DOWN; // 切换阶段 + idleTime_ = SECOND_TO_MINISECOND - ANIMATE_TIME; // 设置空闲时间 + } + else if (diffTime >= idleTime_) + { + // 如果时间差超过空闲时间,绘制渐变圆圈 + uint32_t curTime = diffTime - idleTime_; + int16_t arcCurr = EasingEquation::QuadEaseInOut(0, DEGREES_PER_CIRCLE, + curTime, SECOND_TO_MINISECOND - idleTime_); + UpdatePath(180, arcCurr + 180, false); // 从180度开始绘制 + } + } + + void CountdownBackAnimatorCallback::SetInfo(UILabel *label, int counts) + { + // 设置标签和计数值 + counts_ = counts; // 记录倒计时的总次数 + label_ = label; // 记录UILabel对象 + } + + void CountdownBackAnimatorCallback::NotifyStart() + { + // 初始化倒计时动画的状态 + stage_ = countStage::STAGE_GRADUAL_CIRCLE; // 设置为渐变圆圈阶段 + endAngle_ = DEGREES_PER_CIRCLE; // 设置结束角度为完整一圈 + idleTime_ = 200; // 设置初始空闲时间 + degreePerSecond_ = DEGREES_PER_CIRCLE / counts_; // 计算每秒减少的角度 + surplusDegree = DEGREES_PER_CIRCLE - degreePerSecond_ * counts_; // 计算剩余角度 + lastTime_ = HALTick::GetInstance().GetTime(); // 记录当前时间 + + // 初始化标签文本和样式 + label_->SetText(" "); + label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE / 2); // 设置字体为一半大小 + label_->SetStyle(STYLE_TEXT_OPA, OPA_OPAQUE); // 设置标签为不透明 + } + + void CountdownBackAnimatorCallback::CancelCountdown() + { + // 设置阶段为淡出 + stage_ = countStage::STAGE_FADE_OUT; + + // 重置时间以立即开始淡出 + lastTime_ = HALTick::GetInstance().GetTime(); // 记录当前时间 + idleTime_ = 0; // 设置空闲时间为零,以跳过任何等待时间 + + endAngle_ = 0; // 设置结束角度为0,表示取消倒计时 + } + static SaveBatView *g_pSaveBatView{nullptr}; SaveBatView::SaveBatView() { /*开启省电模式*/ uapi_enter_power_saving_mode(); + g_pSaveBatView = this; } @@ -199,8 +482,6 @@ namespace OHOS button_exit->SetImageSrc(SAVE_BUTTON, SAVE_BUTTON); button_exit->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); - // button_exit->SetOnLongPressListener(presenter_); - // button_exit->SetOnClickListener(presenter_); button_exit->SetOnTouchListener(presenter_); container_->Add(button_exit); } @@ -235,7 +516,7 @@ namespace OHOS curren_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); container_->Add(curren_label); curren_label->SetVisible(false); - +#if ANIMATION_TEST // 圆形进度条 backprogress = new UICircleProgress(); if (backprogress == nullptr) @@ -292,6 +573,51 @@ namespace OHOS countlabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); container_->Add(countlabel); countlabel->SetVisible(false); +#else + if (canvas_ == nullptr) + { + canvas_ = new UICanvasExt(); + } + canvas_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + canvas_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + container_->Add(canvas_); + canvas_->SetVisible(false); + + if (label_ == nullptr) + { + label_ = new UILabel(); + } + label_->SetPosition(LABEL_X, LABEL_Y, 180, 120); + label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + container_->Add(label_); + label_->SetVisible(false); + + PaintExt paint; + ColorType lightGreen; + lightGreen.full = LIGHT_GREEN; + paint.SetStyle(Paint::PaintStyle::STROKE_STYLE); + paint.SetStrokeWidth(CIRCLE_BASE_WIDTH); + paint.SetAntialiased(true); + paint.SetStrokeColor(lightGreen); + canvas_->DrawCircle({CENTER_X, CENTER_Y}, RADIUS, paint); + + callBack_ = new CountdownBackAnimatorCallback(canvas_); + if (callBack_ == nullptr) + { + GRAPHIC_LOGE("CallBack new fail"); + return; + } + CountdownBackAnimator_ = new Animator(callBack_, canvas_, 0, true); + if (CountdownBackAnimator_ == nullptr) + { + delete callBack_; + callBack_ = nullptr; + GRAPHIC_LOGE("Animator new fail"); + return; + } + CountdownBackAnimator_->Start(); + callBack_->SetInfo(label_, 3); // 3: countdown numbers +#endif } // 更新当前界面状态 @@ -299,86 +625,118 @@ namespace OHOS { bool state = SaveEleModel::GetInstance()->GetViewState(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateView state %d", state); -#if 0 + // 检查每个组件是否为空,并记录具体信息 if (timelabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timelabel is null"); + return; } if (datelabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "datelabel is null"); + return; } if (batterylabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batterylabel is null"); + return; } if (batteryprogress == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryprogress is null"); + return; } if (batteryiamge == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "batteryiamge is null"); + return; } if (curren_label == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "curren_label is null"); + return; } +#if ANIMATION_TEST if (countlabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "countlabel is null"); + return; } if (wathchiamge == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "wathchiamge is null"); + return; } if (backprogress == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "backprogress is null"); + return; } +#endif if (button_exit == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "button_exit is null"); - } -#endif - // 如果有任何组件为空,返回 - if (timelabel == nullptr || datelabel == nullptr || batterylabel == nullptr || batteryprogress == nullptr || - batteryiamge == nullptr || curren_label == nullptr || - countlabel == nullptr || wathchiamge == nullptr || backprogress == nullptr || button_exit == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "One or more view components are null."); return; } - /*原界面*/ - timelabel->SetVisible(!state); - datelabel->SetVisible(!state); - batterylabel->SetVisible(!state); - batteryprogress->SetVisible(!state); - batteryiamge->SetVisible(!state); - - /*重置计数器*/ - int count = 3; // 初始计数 - int progressValue = 0; // 初始进度值 + // 显示/隐藏原界面组件 + bool showPrimaryView = !state; + timelabel->SetVisible(showPrimaryView); + datelabel->SetVisible(showPrimaryView); + batterylabel->SetVisible(showPrimaryView); + batteryprogress->SetVisible(showPrimaryView); + batteryiamge->SetVisible(showPrimaryView); + +#if ANIMATION_TEST + // 初始化计数器 + int count = 3; + int progressValue = 0; countlabel->SetText(std::to_string(count).c_str()); backprogress->SetValue(progressValue); - /*退出界面*/ + /* 退出界面 */ curren_label->SetVisible(state); countlabel->SetVisible(state); wathchiamge->SetVisible(state); backprogress->SetVisible(state); - if (state) - { - button_exit->SetImageSrc(BACK_BUTTON, BACK_BUTTON); - } - else - { - button_exit->SetImageSrc(SAVE_BUTTON, SAVE_BUTTON); - } +#else + /* 退出界面 */ + curren_label->SetVisible(state); + + // 显示当前时间 + time_t seconds; + time(&seconds); + struct tm pTM; + localtime_r(&seconds, &pTM); + + int hour = pTM.tm_hour; + int minute = pTM.tm_min; + std::string stringtime = + (hour < 10 ? "0" : "") + std::to_string(hour) + ":" + + (minute < 10 ? "0" : "") + std::to_string(minute); + curren_label->SetText(stringtime.c_str()); + label_->SetVisible(state); + canvas_->SetVisible(state); + +#endif + + // 设置退出按钮图像 + const char *buttonImage = state ? BACK_BUTTON : SAVE_BUTTON; + button_exit->SetImageSrc(buttonImage, buttonImage); + } + + /*动画的控制*/ + void SaveBatView::StartCanvas() + { + callBack_->NotifyStart(); + } + void SaveBatView::StopCanvas() + { + callBack_->CancelCountdown(); } + void SaveBatView::OnStart() { container_ = new UIViewGroup(); -- 2.17.1