From: Caisking <3449750381@qq.com> Date: Fri, 19 Apr 2024 10:31:04 +0000 (+0800) Subject: 设置训练目标达标弹窗,测试弹窗功能成功 X-Git-Tag: release_V1.2.70_20241020_135402~1169 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=2b0deea23ab221964fff94d9a488525522b335b0;p=mirrors%2FFD230.git 设置训练目标达标弹窗,测试弹窗功能成功 问题: 设置目标的GetIndex的组件函数没有生效 亮屏函数没有生效 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h index 1b36688d4..b9d7890a2 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h @@ -142,9 +142,9 @@ namespace OHOS // 训练目标类型 enum class ExerciseTag { + Distance, Duration, Calories, - Distance, STEP, UNKNOW, }; @@ -186,7 +186,7 @@ namespace OHOS end_time = nullptr; sportType = Exercisetype::FITNESS; sportId = UIResourceTextId::STR_EXTREME_SPORTS; - sportTag = ExerciseTag::Duration; + sportTag = ExerciseTag::UNKNOW; } void Reset() @@ -209,7 +209,8 @@ namespace OHOS bool InitButton(UIButton *&button, int left, int top, int width, int height, const char *viewId); bool InitButtonExt(UILabelButtonExt *&button, int left, int top, int width, int height, const char *viewId, UIResourceTextId id, int fontSize); bool InitImageView(UIImageView *&imageView, int left, int top, int width, int height, const char *viewId, const char *imagePath); - + const char **CreateImagePathsArray(const char *basePath, const char *fileExtension, int numImages); + void InitImageAnimatorSource(UIImageAnimatorView *&imageAnimator, const char **imagePaths, int numFrames, int left, int top, int width, int height, const char *viewId, int time); void InitList(); /*定时器 */ @@ -242,6 +243,10 @@ namespace OHOS uint32_t GetTrainingTime(); /*设置训练目标类型以及训练目标*/ void SetSportTag(ExerciseTag tagtpye, int tag); + /*获取训练目标*/ + int GetSportTag(); + /*获取项目目标类型*/ + ExerciseTag GetSportTagtype(); std::string GetStartTiemStr(); std::string GetEndTiemStr(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp index e5b712d02..054a47cc7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -351,7 +351,69 @@ namespace OHOS // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingModel::InitImageView is succeed"); return true; } + /** + * 创建包含图片文件路径的数组 + * @param basePath 包含图片文件的基本路径 + * @param fileExtension 图片文件的扩展名 + * @param numImages 图片文件的数量 + * @return 返回包含图片文件路径的数组 + */ + const char **TraingModel::CreateImagePathsArray(const char *basePath, const char *fileExtension, int numImages) + { + const char **imagePaths = new const char *[numImages]; + char buffer[256]; + for (int i = 0; i < numImages; i++) + { + snprintf(buffer, sizeof(buffer), "%s/%d.%s", basePath, i + 1, fileExtension); + imagePaths[i] = strdup(buffer); + } + return imagePaths; + } + /** + * @brief 初始化UIImageAnimatorView,并设置为GIF动画。 + * + * 该函数用于使用提供的GIF图像和属性初始化UIImageAnimatorView。 + * + * @param imageAnimator 要初始化的UIImageAnimatorView对象的引用。 + * @param paths GIF图像文件路径的数组。 + * @param numFrames GIF中的帧数。 + * @param left 视图的左侧位置。 + * @param top 视图的顶部位置。 + * @param width 视图的宽度。 + * @param height 视图的高度。 + * @param viewId 视图的ID。 + * @param time 视图的帧速 + * @return 如果初始化成功则返回true,否则返回false。 + */ + void TraingModel::InitImageAnimatorSource(UIImageAnimatorView *&imageAnimator, const char **imagePaths, int numFrames, int left, int top, int width, int height, const char *viewId, int time) + { + if (imageAnimator == nullptr) + { + imageAnimator = new UIImageAnimatorView(); + } + imageAnimator->SetPosition(left, top); + imageAnimator->Resize(width, height); + imageAnimator->SetViewId(viewId); + imageAnimator->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + imageAnimator->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + + ImageAnimatorInfo *imageAnimatorInfo = new ImageAnimatorInfo[numFrames]; + for (int i = 0; i < numFrames; i++) + { + imageAnimatorInfo[i].imagePath = imagePaths[i]; + imageAnimatorInfo[i].pos.x = left; + imageAnimatorInfo[i].pos.y = top; + imageAnimatorInfo[i].width = width; + imageAnimatorInfo[i].height = height; + imageAnimatorInfo[i].imageType = IMG_SRC_FILE_PATH; + } + imageAnimator->SetImageAnimatorSrc(imageAnimatorInfo, numFrames, time); // 200 is the default delay time + imageAnimator->SetTimeOfPause(time); + imageAnimator->SetRepeatTimes(1); + imageAnimator->SetReverse(true); + // imageAnimator->SetVisible(true); + } /* -------------------------------------------------------------------------- */ /*设置运动类型*/ void TraingModel::SetSportType(Exercisetype type) @@ -444,6 +506,16 @@ namespace OHOS { return sportdata->calories; } + /*获取训练目标*/ + int TraingModel::GetSportTag() + { + return sportdata->tag; + } + /*获取训练项目类型*/ + ExerciseTag TraingModel::GetSportTagtype() + { + return sportdata->sportTag; + } /*设置时间*/ void TraingModel::SetTimestamp() { @@ -458,6 +530,12 @@ namespace OHOS { sportdata->Reset(); // 重置结构体 sportdata->starttime = time; + if (tag_) + { + // 有值才设置 + sportdata->sportTag = sportTag_; + sportdata->tag = tag_; + } char *start_date = (char *)malloc(9 * sizeof(char)); // 分配内存给start_date if (uapi_get_YYMMDD_Time(start_date, '/') != ERRCODE_SUCC) { @@ -546,6 +624,7 @@ namespace OHOS /*设置训练目标类型以及训练目标*/ void TraingModel::SetSportTag(ExerciseTag tagtpye, int tag) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tagtpye[%d] tag[%d]", tagtpye, tag); sportTag_ = tagtpye; tag_ = tag; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp index 203288014..b34a2b760 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp @@ -119,6 +119,8 @@ namespace OHOS { int tag = GetTagFromCard(CardID); TraingModel::GetInstance()->SetSportTag(GetExerciseTagFromCard(CardID), tag); + // TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试 + PRINT("GetButtonIdFromCard:%d tag:%d \r\n", CardID, tag); NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGCRAD); ExerciseClass type = TraingModel::GetInstance()->GetSportType(); TraingCardPresenter::GetInstance()->OpenSensor(type); @@ -135,7 +137,6 @@ namespace OHOS */ const char *TraingSetPresenter::GetButtonIdFromCard(int cardID) { - PRINT("GetButtonIdFromCard:%d\r\n", cardID); switch (cardID) { case SET_DURATION: @@ -156,7 +157,7 @@ namespace OHOS */ ExerciseTag TraingSetPresenter::GetExerciseTagFromCard(int cardID) { - PRINT("GetExerciseTagFromCard:%d\r\n", cardID); + ; switch (cardID) { case SET_DURATION: @@ -177,7 +178,6 @@ namespace OHOS */ int TraingSetPresenter::GetTagFromCard(int cardID) { - PRINT("GetTagFromCard:%d\r\n", cardID); switch (cardID) { case SET_DURATION: diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingWinView.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingWinView.cpp index 4297dc0a7..854ec1d8e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingWinView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingWinView.cpp @@ -130,11 +130,6 @@ namespace OHOS // label4_->SetTextColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0x7f)); container_->Add(label4_); - /* - 初始化image - TraingModel::GetInstance()->InitImageView(image1_, 173, 100, 120, 120, "image1", imagePath_win); - container_->Add(image1_); - */ // 初始化图片数组 const char *basePath = "/user/res/Training/training_GIF/win/"; diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardPresenter.h index 9fa8b5f1f..68da5986f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardPresenter.h @@ -56,6 +56,9 @@ namespace OHOS // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; bool OnClick(UIView &view, const ClickEvent &event) override; bool OnDrag(UIView &view, const DragEvent &event) override; + int tag_ = 0; + bool opensensorstuats{false}; + bool gettagstuats{false}; // bool OnDragEnd(UIView& view, const DragEvent& event) override; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardView.h b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardView.h index 98ff79110..604c5be2d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardView.h @@ -36,6 +36,7 @@ namespace OHOS { #define BUTTONEXIT "button_exit" #define BUTTONBACK "button_back" +#define BUTTONWINOK "buttom_win" enum Control_Card { @@ -43,7 +44,11 @@ namespace OHOS DATA, MUSIC }; - + enum PopupType + { + EndPopup, + GetTagPopup + }; class TraingCardPresenter; class TrainingControlView; class TrainingDataView; @@ -72,11 +77,14 @@ namespace OHOS void InitList(); void PreLoad(void); - void SetEndViewStatus(bool status); + void InitImageAnimatorSource(); + void ShowGetTagView(); void ShowEndView(); bool RefreshEndView(); UIView *GetTraingCrad(); int GetCurrentPage(); + void SetPopupViewStatus(PopupType type, bool status); + UIImageAnimatorView *GetAnimator(); private: UIView::OnDragListener *draglistener{nullptr}; @@ -85,16 +93,27 @@ namespace OHOS UICrossView *swipe_ = nullptr; UIScrollView *endView{nullptr}; + UIScrollView *getView{nullptr}; TrainingControlView *ControlView{nullptr}; // 控制卡片 TrainingDataView *DataVIew{nullptr}; // 数据卡片 TrainingDetailView *DetailView{nullptr}; // 详细数据卡片 PlayersView *MusicView{nullptr}; // 音乐卡片 - UILabelExt *endtitle{nullptr}; // 结束弹窗title - UILabelExt *notelabel{nullptr}; // 提醒label + + /*结束弹窗*/ + UILabelExt *endtitle{nullptr}; // 结束弹窗title + UILabelExt *notelabel{nullptr}; // 提醒label UILabelExt *endnotelabel{nullptr}; UIButton *exit{nullptr}; // 退出按键 UIButton *back{nullptr}; // 返回按键 + /*达成训练目标弹窗*/ + UILabelExt *labeltitle = nullptr; + UILabelExt *labeltag = nullptr; + UILabelExt *labelgettag = nullptr; + UILabelExt *labelpre = nullptr; + UILabelButtonExt *buttonok_ = nullptr; + UIImageAnimatorView *imageAnimator{nullptr}; + bool viewiInitStatus{false}; bool momentumFlag{false}; }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h index e69de29bb..4bb465ceb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h @@ -0,0 +1,64 @@ +/*** + * @Date: 2024-04-17 16:32:02 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-04-19 10:20:35 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h + */ +#ifndef _TrainingWin_VIEW_H +#define _TrainingWin_VIEW_H + +#include "BaseView.h" +#include "View.h" +#include +#include "components/ui_view_group.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +#include "components/ui_image_animator.h" +#include "components/ui_label_button_ext.h" +#include "components/ui_chart.h" +#include "components/ui_list.h" +#include "components/icon_adapter.h" +#include "wearable_log.h" +#include "ohos_types.h" +#include "components/ui_card_page.h" +#include "traing/include/TraingModel.h" +#include "traing/Training_UiConfig.h" + +namespace OHOS +{ +#define BUTTONWINOK "buttonwin" + + class TrainingWinPresenter; + class TrainingWinView : public View + { + + public: + TrainingWinView(); + virtual ~TrainingWinView(); + static TrainingWinView *GetInstance(void); + + + void InitView(); + void DeInit(); + void InitImageAnimatorSource(UIImageAnimatorView *&imageAnimator, const char **imagePaths, int numFrames, int left, int top, int width, int height, const char *viewId,int time); + void PreLoad(void); + + private: + UIView::OnDragListener *draglistener{nullptr}; + TrainingWinView(TrainingWinView &&) = delete; + TrainingWinView &operator=(TrainingWinView &&) = delete; + UIViewGroup *container_ = nullptr; + UILabelExt *labeltitle = nullptr; + UILabelExt *labeltag = nullptr; + UILabelExt *labelgettag = nullptr; + UILabelExt *labelpre = nullptr; + UIButton *buttonok_ = nullptr; + UIImageView *image1_ = nullptr; + UIImageAnimatorView *imageAnimator; + bool viewiInitStatus{false}; + }; + +} // namespace OHOS +#endif // TrainingWin_PRESENTER_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp index 577fe3aab..4f4b42412 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp @@ -11,10 +11,12 @@ #include "traing/training_card/include/TraingCardPresenter.h" #include "traing/include/TraingModel.h" #include "custom_utils.h" +#include "vibrator_service.h" #include #include extern "C" void do_cywee_service_check_msg(int cmd, int data[]); +extern "C" void custom_VibratorFunc(OHOS::VibratorType vibratorType); #define MAXSPORTID 176 extern "C" @@ -36,7 +38,7 @@ namespace OHOS TraingCardPresenter::~TraingCardPresenter() { - + // tag_ = 0; g_pTraingCardPresenter = nullptr; } @@ -49,7 +51,7 @@ namespace OHOS void TraingCardPresenter::OnStart() { Presenter::OnStart(); - ScreenAlwaysOnCtr(1); // 长亮屏 + // ScreenAlwaysOnCtr(1); // 长亮屏 } void TraingCardPresenter::OnPause(void) @@ -100,6 +102,12 @@ namespace OHOS /*开启cywee*/ bool TraingCardPresenter::OpenSensor(ExerciseClass type) { + // 防止重复开启 + if (opensensorstuats) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OpenSensor is opening!!"); + return false; + } // 根据不同的运动项目进行不同的运动 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TraingCardPresenter::OpenSensor!!"); switch (type) @@ -125,6 +133,7 @@ namespace OHOS default: break; } + opensensorstuats = true; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OpenSensor--%d!!", type); return true; } @@ -136,7 +145,7 @@ namespace OHOS { case ExerciseState::End: // 退出进入普通模式 - OpenSensor(ExerciseClass::NORMAL); + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NORMAL_MODE, NULL); break; case ExerciseState::Pause: do_cywee_service_check_msg(CYWEE_SERVICE_CMD_PAUSE, 0); @@ -154,12 +163,58 @@ namespace OHOS void TraingCardPresenter::RefreshData() { SportData *sportdata = TraingModel::GetInstance()->GetSportdata(); - if (sportdata == nullptr) { - // 处理数据为空的情况 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata is null"); return; } + PRINT("sportdata->tag[%d] sportdata->sportTag[%d]\r\n", sportdata->tag, sportdata->sportTag); + // 首先需要判断有没有设置训练目标 + if (sportdata->tag && (!gettagstuats)) + { + // 根据设置的训练目标类型去对应相对的数据 + switch (sportdata->sportTag) + { + case ExerciseTag::Duration: + break; + case ExerciseTag::Calories: + if (sportdata->calories >= sportdata->tag) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Calories"); + uapi_set_screen_on_api(); // 亮屏检测 + custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO); + TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true); + TraingCardView::GetInstance()->GetAnimator()->Start(); + gettagstuats = true; + } + break; + case ExerciseTag::Distance: + if (sportdata->distance >= sportdata->tag) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Distance"); + uapi_set_screen_on_api(); // 亮屏检测 + custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO); + TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true); + TraingCardView::GetInstance()->GetAnimator()->Start(); + gettagstuats = true; + } + break; + case ExerciseTag::STEP: + if (sportdata->steps >= sportdata->tag) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "STEP"); + uapi_set_screen_on_api(); // 亮屏检测 + custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO); + TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true); + TraingCardView::GetInstance()->GetAnimator()->Start(); + gettagstuats = true; + } + break; + default: + break; + } + } + std::string distanceStr; if (sportdata->distance != 0) { @@ -184,7 +239,7 @@ namespace OHOS TrainingDetailView::GetInstance()->GetMileLabel()->SetText(distanceStr.c_str()); TrainingDetailView::GetInstance()->GetStepLabel()->SetText(stepsStr.c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ControlSensor--Calories: %s, Distance: %s, Steps: %s", calorieStr.c_str(), distanceStr.c_str(), stepsStr.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Calories: %s, Distance: %s, Steps: %s]", calorieStr.c_str(), distanceStr.c_str(), stepsStr.c_str()); // 释放sportdata内存 } @@ -233,7 +288,7 @@ namespace OHOS { ControlSensor(ExerciseState::Pause); // 弹窗显示是否结束 - TraingCardView::GetInstance()->SetEndViewStatus(true); + TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, true); TraingCardView::GetInstance()->RefreshEndView(); } // 退出按键 @@ -255,25 +310,48 @@ namespace OHOS if (strcmp(view.GetViewId(), BUTTONBACK) == 0) { ControlSensor(ExerciseState::Continue); - TraingCardView::GetInstance()->SetEndViewStatus(false); + TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, false); + } + // 达到目标退出按键 + if (strcmp(view.GetViewId(), BUTTONWINOK) == 0) + { + TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, false); + TraingCardView::GetInstance()->GetAnimator()->Stop(); } return true; } + /*蓝牙控制接口*/ bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) { - if (cmd == nullptr || cmd->sportType > MAXSPORTID || cmd->sportType < 0) + + if (cmd == nullptr || cmd->sportType < 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid sport command"); return false; } - uapi_set_screen_on_api(); // 亮屏检测 NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGCRAD); // 切换Slice - OpenSensor(static_cast(cmd->sportType)); - ControlSensor(static_cast(cmd->controlmd)); + switch (cmd->sportType) + { + // 室外走路 + case 0: + OpenSensor(ExerciseClass::FREE_TRAINING); + break; + // 室外骑行 + case 1: + OpenSensor(ExerciseClass::FREE_TRAINING); + break; + // 室外跑步 + case 2: + OpenSensor(ExerciseClass::OUTDOOR); + break; + default: + break; + } + ControlSensor(static_cast(cmd->controlmd)); return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp index 0969a4779..bb1c894e7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp @@ -75,6 +75,7 @@ namespace OHOS swipe_->HorAdd(DataVIew); swipe_->HorAdd(MusicView); ShowEndView(); + ShowGetTagView(); // swipe_->HorAdd(DetailView); swipe_->VerAdd(DetailView, UICrossView::VPage::DOWN_PAGE); @@ -86,12 +87,7 @@ namespace OHOS /* DeInit:删除组件 */ void TraingCardView::DeInit() { - if (swipe_ != nullptr) - { - swipe_->RemoveAll(); - delete swipe_; - swipe_ = nullptr; - } + /*界面*/ if (ControlView != nullptr) { ControlView->RemoveAll(); @@ -122,6 +118,13 @@ namespace OHOS delete endView; endView = nullptr; } + if (getView != nullptr) + { + getView->RemoveAll(); + delete getView; + getView = nullptr; + } + /*标签*/ if (endtitle != nullptr) { delete endtitle; @@ -137,6 +140,27 @@ namespace OHOS delete endnotelabel; endnotelabel = nullptr; } + if (labeltitle != nullptr) + { + delete labeltitle; + labeltitle = nullptr; + } + if (labeltag != nullptr) + { + delete labeltag; + labeltag = nullptr; + } + if (labelgettag != nullptr) + { + delete labelgettag; + labelgettag = nullptr; + } + if (labelpre != nullptr) + { + delete labelpre; + labelpre = nullptr; + } + /*按键*/ if (exit != nullptr) { delete exit; @@ -147,6 +171,25 @@ namespace OHOS delete back; back = nullptr; } + if (buttonok_ != nullptr) + { + delete buttonok_; + buttonok_ = nullptr; + } + /*动画*/ + if (imageAnimator != nullptr) + { + imageAnimator->Stop(); + delete imageAnimator; + imageAnimator = nullptr; + } + + if (swipe_ != nullptr) + { + swipe_->RemoveAll(); + delete swipe_; + swipe_ = nullptr; + } } UICardPage *TraingCardView::InitControlPage(void) { @@ -263,22 +306,32 @@ namespace OHOS endView->SetVisible(false); // 界面隐藏 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowEndView end"); } - /*设置结束弹窗状态*/ - void TraingCardView::SetEndViewStatus(bool status) + /*设置弹窗状态*/ + void TraingCardView::SetPopupViewStatus(PopupType type, bool status) { - if (endView == nullptr) + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", type); + UIView *popupView = nullptr; + if (type == EndPopup) + { + popupView = endView; + } + else if (type == GetTagPopup) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingCardView EndView is NULL"); + popupView = getView; + } + + if (popupView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PopupView is NULL"); return; } - /*增加训练卡片控制*/ UIView *cardview = TraingCardView::GetInstance()->GetTraingCrad(); if (cardview != nullptr) { cardview->SetVisible(!status); } - endView->SetVisible(status); - return; + + popupView->SetVisible(status); } /*获取运动量结束弹窗界面刷新*/ bool TraingCardView::RefreshEndView() @@ -303,6 +356,93 @@ namespace OHOS } return momentumFlag; } + + /*初始化动画以及Taglabel*/ + void TraingCardView::InitImageAnimatorSource() + { + int tag = TraingModel::GetInstance()->GetSportTag(); + ExerciseTag tagType = TraingModel::GetInstance()->GetSportTagtype(); + std::string tagString = std::to_string(tag); + switch (tagType) + { + case ExerciseTag::Duration: + { + int hours = tag / 60; + int minutes = tag % 60; + int seconds = 0; + // 将小时、分钟、秒转换为字符串,并在小于10时补零 + std::string hoursStr = (hours < 10) ? "0" + std::to_string(hours) : std::to_string(hours); + std::string minutesStr = (minutes < 10) ? "0" + std::to_string(minutes) : std::to_string(minutes); + std::string secondsStr = (seconds < 10) ? "0" + std::to_string(seconds) : std::to_string(seconds); + tagString = hoursStr + ":" + minutesStr + ":" + secondsStr; + break; + } + case ExerciseTag::Calories: + { + tagString = tagString + "kcal"; + break; + } + case ExerciseTag::Distance: + { + tagString = tagString + "km"; + break; + } + case ExerciseTag::STEP: + break; + default: + break; + } + PRINT("tag[%d]-tagType[%d]-tagString[%s]\r\n", tag, tagType, tagString.c_str()); + TraingModel::GetInstance()->InitLabel(labeltag, 70, 215, 326, 97, "label2", tagString.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 80); + labeltag->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff)); + getView->Add(labeltag); + + // 初始化图片数组以及动画 + const char *basePath = "/user/res/Training/training_GIF/win/"; + const char *fileExtension = "bin"; + const char **imagePaths = TraingModel::GetInstance()->CreateImagePathsArray(basePath, fileExtension, 94); + TraingModel::GetInstance()->InitImageAnimatorSource(imageAnimator, imagePaths, 94, 173, 100, 120, 120, "imageAnimator1", 10); + getView->Add(imageAnimator); + } + + /*目标达成展示*/ + void TraingCardView::ShowGetTagView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowGetTagView"); + getView = new UIScrollView(); + if (getView == nullptr) + { + return; + } + getView->SetPosition(0, 0); + getView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + getView->SetScrollBlankSize(20); + getView->SetReboundSize(50); + getView->SetDirection(1); + + // 初始化Lable + TraingModel::GetInstance()->InitLabel(labeltitle, 83, 50, 300, 35, "label1", "目标已达成", DEFAULT_VECTOR_FONT_FILENAME, 35); + getView->Add(labeltitle); + getView->Add(labeltag); + TraingModel::GetInstance()->InitLabel(labelgettag, 103, 307, 200, 35, "label3", "完成目标", DEFAULT_VECTOR_FONT_FILENAME, 30); + getView->Add(labelgettag); + TraingModel::GetInstance()->InitLabel(labelpre, 233, 307, 160, 35, "label3", "100%", DEFAULT_VECTOR_FONT_FILENAME, 30); + getView->Add(labelpre); + + // 初始化按键 + TraingModel::GetInstance()->InitButtonExt(buttonok_, 0, 366, 466, 100, BUTTONWINOK, STR_OK, 30); + buttonok_->SetImageSrc(BUTTONOK_IMAGE, BUTTONOK_IMAGE); + buttonok_->SetOnClickListener(static_cast(TraingCardPresenter::GetInstance())); + getView->Add(buttonok_); + + InitImageAnimatorSource(); + RootView::GetInstance()->Add(getView); + getView->SetDraggable(false); + getView->SetTouchable(true); + getView->SetVisible(false); // 界面隐藏 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowGetTagView end"); + } + /*获取卡片View单例*/ UIView *TraingCardView::GetTraingCrad() { @@ -331,4 +471,8 @@ namespace OHOS { return swipe_->GetCurrentPageId(0); // 获取水平页面 } + UIImageAnimatorView *TraingCardView::GetAnimator() + { + return imageAnimator; + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/Training_CardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/Training_CardView.cpp index 6f024f910..4adba249f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/Training_CardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/Training_CardView.cpp @@ -142,9 +142,9 @@ namespace OHOS }; ImageInfo images[] = { - {image1, TRAINING_WALKING_BIG, 126, 298, "image3"}, + {image1, TRAINING_WALKING_BIG, 126, 148, "image3"}, {image2, TRAINING_RIDING_BIG2, 276, 148, "image2"}, - {image3, TRAINING_RUNNING_BIG, 126, 148, "image1"}}; + {image3, TRAINING_RUNNING_BIG, 126, 298, "image1"}}; for (auto &imageInfo : images) { diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h index 715a99ac1..6c7795a2f 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h @@ -56,8 +56,10 @@ enum TRANING typedef struct { - int sportType; - int controlmd; + uint8_t sportType; //训练项目 + uint8_t sportTagType; //训练目标类型 + uint8_t sportTag; //训练目标 + uint8_t controlmd; //训练控制md } training_ble; void set_weather_now_data(int humidity, char* windScale, char* textNight,int uvIndex,int temp,int iconNight);