设置训练目标达标弹窗,测试弹窗功能成功
authorCaisking <3449750381@qq.com>
Fri, 19 Apr 2024 10:31:04 +0000 (18:31 +0800)
committerCaisking <3449750381@qq.com>
Fri, 19 Apr 2024 10:31:04 +0000 (18:31 +0800)
问题:
设置目标的GetIndex的组件函数没有生效
亮屏函数没有生效

code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingWinView.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardPresenter.h
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TraingCardView.h
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingWinView.h
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/Training_CardView.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h

index 1b36688..b9d7890 100644 (file)
@@ -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();
index e5b712d..054a47c 100644 (file)
@@ -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;
     }
index 2032880..b34a2b7 100644 (file)
@@ -119,6 +119,8 @@ namespace OHOS
             {\r
                 int tag = GetTagFromCard(CardID);\r
                 TraingModel::GetInstance()->SetSportTag(GetExerciseTagFromCard(CardID), tag);\r
+                // TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试\r
+                PRINT("GetButtonIdFromCard:%d tag:%d \r\n", CardID, tag);\r
                 NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGCRAD);\r
                 ExerciseClass type = TraingModel::GetInstance()->GetSportType();\r
                 TraingCardPresenter::GetInstance()->OpenSensor(type);\r
@@ -135,7 +137,6 @@ namespace OHOS
      */\r
     const char *TraingSetPresenter::GetButtonIdFromCard(int cardID)\r
     {\r
-        PRINT("GetButtonIdFromCard:%d\r\n", cardID);\r
         switch (cardID)\r
         {\r
         case SET_DURATION:\r
@@ -156,7 +157,7 @@ namespace OHOS
      */\r
     ExerciseTag TraingSetPresenter::GetExerciseTagFromCard(int cardID)\r
     {\r
-        PRINT("GetExerciseTagFromCard:%d\r\n", cardID);\r
+        ;\r
         switch (cardID)\r
         {\r
         case SET_DURATION:\r
@@ -177,7 +178,6 @@ namespace OHOS
      */\r
     int TraingSetPresenter::GetTagFromCard(int cardID)\r
     {\r
-        PRINT("GetTagFromCard:%d\r\n", cardID);\r
         switch (cardID)\r
         {\r
         case SET_DURATION:\r
index 4297dc0..854ec1d 100644 (file)
@@ -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/";
index 9fa8b5f..68da598 100644 (file)
@@ -56,6 +56,9 @@ namespace OHOS
         // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
         bool OnClick(UIView &view, const ClickEvent &event) override;\r
         bool OnDrag(UIView &view, const DragEvent &event) override;\r
+        int tag_ = 0;\r
+        bool opensensorstuats{false};\r
+        bool gettagstuats{false};\r
         // bool OnDragEnd(UIView& view, const DragEvent& event) override;\r
     };\r
 } // namespace OHOS\r
index 98ff791..604c5be 100644 (file)
@@ -36,6 +36,7 @@ namespace OHOS
 {\r
 #define BUTTONEXIT "button_exit"\r
 #define BUTTONBACK "button_back"\r
+#define BUTTONWINOK "buttom_win"\r
 \r
     enum Control_Card\r
     {\r
@@ -43,7 +44,11 @@ namespace OHOS
         DATA,\r
         MUSIC\r
     };\r
-\r
+    enum PopupType\r
+    {\r
+        EndPopup,\r
+        GetTagPopup\r
+    };\r
     class TraingCardPresenter;\r
     class TrainingControlView;\r
     class TrainingDataView;\r
@@ -72,11 +77,14 @@ namespace OHOS
         void InitList();\r
         void PreLoad(void);\r
 \r
-        void SetEndViewStatus(bool status);\r
+        void InitImageAnimatorSource();\r
+        void ShowGetTagView();\r
         void ShowEndView();\r
         bool RefreshEndView();\r
         UIView *GetTraingCrad();\r
         int GetCurrentPage();\r
+        void SetPopupViewStatus(PopupType type, bool status);\r
+        UIImageAnimatorView *GetAnimator();\r
 \r
     private:\r
         UIView::OnDragListener *draglistener{nullptr};\r
@@ -85,16 +93,27 @@ namespace OHOS
 \r
         UICrossView *swipe_ = nullptr;\r
         UIScrollView *endView{nullptr};\r
+        UIScrollView *getView{nullptr};\r
         TrainingControlView *ControlView{nullptr}; // 控制卡片\r
         TrainingDataView *DataVIew{nullptr};       // 数据卡片\r
         TrainingDetailView *DetailView{nullptr};   // 详细数据卡片\r
         PlayersView *MusicView{nullptr};           // 音乐卡片\r
-        UILabelExt *endtitle{nullptr};             // 结束弹窗title\r
-        UILabelExt *notelabel{nullptr};            // 提醒label\r
+\r
+        /*结束弹窗*/\r
+        UILabelExt *endtitle{nullptr};  // 结束弹窗title\r
+        UILabelExt *notelabel{nullptr}; // 提醒label\r
         UILabelExt *endnotelabel{nullptr};\r
         UIButton *exit{nullptr}; // 退出按键\r
         UIButton *back{nullptr}; // 返回按键\r
 \r
+        /*达成训练目标弹窗*/\r
+        UILabelExt *labeltitle = nullptr;\r
+        UILabelExt *labeltag = nullptr;\r
+        UILabelExt *labelgettag = nullptr;\r
+        UILabelExt *labelpre = nullptr;\r
+        UILabelButtonExt *buttonok_ = nullptr;\r
+        UIImageAnimatorView *imageAnimator{nullptr};\r
+\r
         bool viewiInitStatus{false};\r
         bool momentumFlag{false};\r
     };\r
index e69de29..4bb465c 100644 (file)
@@ -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 <ui_scroll_view.h>
+#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<TrainingWinPresenter>
+    {
+
+    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
index 577fe3a..4f4b424 100644 (file)
 #include "traing/training_card/include/TraingCardPresenter.h"\r
 #include "traing/include/TraingModel.h"\r
 #include "custom_utils.h"\r
+#include "vibrator_service.h"\r
 #include <iomanip>\r
 #include <sstream>\r
 \r
 extern "C" void do_cywee_service_check_msg(int cmd, int data[]);\r
+extern "C" void custom_VibratorFunc(OHOS::VibratorType vibratorType);\r
 #define MAXSPORTID 176\r
 \r
 extern "C"\r
@@ -36,7 +38,7 @@ namespace OHOS
 \r
     TraingCardPresenter::~TraingCardPresenter()\r
     {\r
-\r
+        // tag_ = 0;\r
         g_pTraingCardPresenter = nullptr;\r
     }\r
 \r
@@ -49,7 +51,7 @@ namespace OHOS
     void TraingCardPresenter::OnStart()\r
     {\r
         Presenter<TraingCardView>::OnStart();\r
-        ScreenAlwaysOnCtr(1); // 长亮屏\r
+        // ScreenAlwaysOnCtr(1); // 长亮屏\r
     }\r
 \r
     void TraingCardPresenter::OnPause(void)\r
@@ -100,6 +102,12 @@ namespace OHOS
     /*开启cywee*/\r
     bool TraingCardPresenter::OpenSensor(ExerciseClass type)\r
     {\r
+        // 防止重复开启\r
+        if (opensensorstuats)\r
+        {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OpenSensor is opening!!");\r
+            return false;\r
+        }\r
         // 根据不同的运动项目进行不同的运动\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TraingCardPresenter::OpenSensor!!");\r
         switch (type)\r
@@ -125,6 +133,7 @@ namespace OHOS
         default:\r
             break;\r
         }\r
+        opensensorstuats = true;\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OpenSensor--%d!!", type);\r
         return true;\r
     }\r
@@ -136,7 +145,7 @@ namespace OHOS
         {\r
         case ExerciseState::End:\r
             // 退出进入普通模式\r
-            OpenSensor(ExerciseClass::NORMAL);\r
+            do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NORMAL_MODE, NULL);\r
             break;\r
         case ExerciseState::Pause:\r
             do_cywee_service_check_msg(CYWEE_SERVICE_CMD_PAUSE, 0);\r
@@ -154,12 +163,58 @@ namespace OHOS
     void TraingCardPresenter::RefreshData()\r
     {\r
         SportData *sportdata = TraingModel::GetInstance()->GetSportdata();\r
-\r
         if (sportdata == nullptr)\r
         {\r
-            // 处理数据为空的情况\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata is null");\r
             return;\r
         }\r
+        PRINT("sportdata->tag[%d] sportdata->sportTag[%d]\r\n", sportdata->tag, sportdata->sportTag);\r
+        // 首先需要判断有没有设置训练目标\r
+        if (sportdata->tag && (!gettagstuats))\r
+        {\r
+            // 根据设置的训练目标类型去对应相对的数据\r
+            switch (sportdata->sportTag)\r
+            {\r
+            case ExerciseTag::Duration:\r
+                break;\r
+            case ExerciseTag::Calories:\r
+                if (sportdata->calories >= sportdata->tag)\r
+                {\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Calories");\r
+                    uapi_set_screen_on_api(); // 亮屏检测\r
+                    custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);\r
+                    TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);\r
+                    TraingCardView::GetInstance()->GetAnimator()->Start();\r
+                    gettagstuats = true;\r
+                }\r
+                break;\r
+            case ExerciseTag::Distance:\r
+                if (sportdata->distance >= sportdata->tag)\r
+                {\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Distance");\r
+                    uapi_set_screen_on_api(); // 亮屏检测\r
+                    custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);\r
+                    TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);\r
+                    TraingCardView::GetInstance()->GetAnimator()->Start();\r
+                    gettagstuats = true;\r
+                }\r
+                break;\r
+            case ExerciseTag::STEP:\r
+                if (sportdata->steps >= sportdata->tag)\r
+                {\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "STEP");\r
+                    uapi_set_screen_on_api(); // 亮屏检测\r
+                    custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);\r
+                    TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);\r
+                    TraingCardView::GetInstance()->GetAnimator()->Start();\r
+                    gettagstuats = true;\r
+                }\r
+                break;\r
+            default:\r
+                break;\r
+            }\r
+        }\r
+\r
         std::string distanceStr;\r
         if (sportdata->distance != 0)\r
         {\r
@@ -184,7 +239,7 @@ namespace OHOS
         TrainingDetailView::GetInstance()->GetMileLabel()->SetText(distanceStr.c_str());\r
         TrainingDetailView::GetInstance()->GetStepLabel()->SetText(stepsStr.c_str());\r
 \r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ControlSensor--Calories: %s, Distance: %s, Steps: %s", calorieStr.c_str(), distanceStr.c_str(), stepsStr.c_str());\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Calories: %s, Distance: %s, Steps: %s]", calorieStr.c_str(), distanceStr.c_str(), stepsStr.c_str());\r
 \r
         // 释放sportdata内存\r
     }\r
@@ -233,7 +288,7 @@ namespace OHOS
         {\r
             ControlSensor(ExerciseState::Pause);\r
             // 弹窗显示是否结束\r
-            TraingCardView::GetInstance()->SetEndViewStatus(true);\r
+            TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, true);\r
             TraingCardView::GetInstance()->RefreshEndView();\r
         }\r
         // 退出按键\r
@@ -255,25 +310,48 @@ namespace OHOS
         if (strcmp(view.GetViewId(), BUTTONBACK) == 0)\r
         {\r
             ControlSensor(ExerciseState::Continue);\r
-            TraingCardView::GetInstance()->SetEndViewStatus(false);\r
+            TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, false);\r
+        }\r
+        // 达到目标退出按键\r
+        if (strcmp(view.GetViewId(), BUTTONWINOK) == 0)\r
+        {\r
+            TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, false);\r
+            TraingCardView::GetInstance()->GetAnimator()->Stop();\r
         }\r
         return true;\r
     }\r
 \r
+    /*蓝牙控制接口*/\r
     bool TraingCardPresenter::send_sport_cmd(training_ble *cmd)\r
     {\r
-        if (cmd == nullptr || cmd->sportType > MAXSPORTID || cmd->sportType < 0)\r
+\r
+        if (cmd == nullptr || cmd->sportType < 0)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid sport command");\r
             return false;\r
         }\r
-\r
         uapi_set_screen_on_api();                                   // 亮屏检测\r
         NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGCRAD); // 切换Slice\r
 \r
-        OpenSensor(static_cast<ExerciseClass>(cmd->sportType));\r
-        ControlSensor(static_cast<ExerciseState>(cmd->controlmd));\r
+        switch (cmd->sportType)\r
+        {\r
+        // 室外走路\r
+        case 0:\r
+            OpenSensor(ExerciseClass::FREE_TRAINING);\r
+            break;\r
+        // 室外骑行\r
+        case 1:\r
+            OpenSensor(ExerciseClass::FREE_TRAINING);\r
+            break;\r
+        // 室外跑步\r
+        case 2:\r
+            OpenSensor(ExerciseClass::OUTDOOR);\r
+            break;\r
+        default:\r
+            break;\r
+        }\r
 \r
+        ControlSensor(static_cast<ExerciseState>(cmd->controlmd));\r
         return true;\r
     }\r
 \r
index 0969a47..bb1c894 100644 (file)
@@ -75,6 +75,7 @@ namespace OHOS
         swipe_->HorAdd(DataVIew);\r
         swipe_->HorAdd(MusicView);\r
         ShowEndView();\r
+        ShowGetTagView();\r
         // swipe_->HorAdd(DetailView);\r
 \r
         swipe_->VerAdd(DetailView, UICrossView::VPage::DOWN_PAGE);\r
@@ -86,12 +87,7 @@ namespace OHOS
     /* DeInit:删除组件 */\r
     void TraingCardView::DeInit()\r
     {\r
-        if (swipe_ != nullptr)\r
-        {\r
-            swipe_->RemoveAll();\r
-            delete swipe_;\r
-            swipe_ = nullptr;\r
-        }\r
+        /*界面*/\r
         if (ControlView != nullptr)\r
         {\r
             ControlView->RemoveAll();\r
@@ -122,6 +118,13 @@ namespace OHOS
             delete endView;\r
             endView = nullptr;\r
         }\r
+        if (getView != nullptr)\r
+        {\r
+            getView->RemoveAll();\r
+            delete getView;\r
+            getView = nullptr;\r
+        }\r
+        /*标签*/\r
         if (endtitle != nullptr)\r
         {\r
             delete endtitle;\r
@@ -137,6 +140,27 @@ namespace OHOS
             delete endnotelabel;\r
             endnotelabel = nullptr;\r
         }\r
+        if (labeltitle != nullptr)\r
+        {\r
+            delete labeltitle;\r
+            labeltitle = nullptr;\r
+        }\r
+        if (labeltag != nullptr)\r
+        {\r
+            delete labeltag;\r
+            labeltag = nullptr;\r
+        }\r
+        if (labelgettag != nullptr)\r
+        {\r
+            delete labelgettag;\r
+            labelgettag = nullptr;\r
+        }\r
+        if (labelpre != nullptr)\r
+        {\r
+            delete labelpre;\r
+            labelpre = nullptr;\r
+        }\r
+        /*按键*/\r
         if (exit != nullptr)\r
         {\r
             delete exit;\r
@@ -147,6 +171,25 @@ namespace OHOS
             delete back;\r
             back = nullptr;\r
         }\r
+        if (buttonok_ != nullptr)\r
+        {\r
+            delete buttonok_;\r
+            buttonok_ = nullptr;\r
+        }\r
+        /*动画*/\r
+        if (imageAnimator != nullptr)\r
+        {\r
+            imageAnimator->Stop();\r
+            delete imageAnimator;\r
+            imageAnimator = nullptr;\r
+        }\r
+\r
+        if (swipe_ != nullptr)\r
+        {\r
+            swipe_->RemoveAll();\r
+            delete swipe_;\r
+            swipe_ = nullptr;\r
+        }\r
     }\r
     UICardPage *TraingCardView::InitControlPage(void)\r
     {\r
@@ -263,22 +306,32 @@ namespace OHOS
         endView->SetVisible(false); // 界面隐藏\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowEndView end");\r
     }\r
-    /*设置结束弹窗状态*/\r
-    void TraingCardView::SetEndViewStatus(bool status)\r
+    /*设置弹窗状态*/\r
+    void TraingCardView::SetPopupViewStatus(PopupType type, bool status)\r
     {\r
-        if (endView == nullptr)\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", type);\r
+        UIView *popupView = nullptr;\r
+        if (type == EndPopup)\r
+        {\r
+            popupView = endView;\r
+        }\r
+        else if (type == GetTagPopup)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingCardView EndView is NULL");\r
+            popupView = getView;\r
+        }\r
+\r
+        if (popupView == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PopupView is NULL");\r
             return;\r
         }\r
-        /*增加训练卡片控制*/\r
         UIView *cardview = TraingCardView::GetInstance()->GetTraingCrad();\r
         if (cardview != nullptr)\r
         {\r
             cardview->SetVisible(!status);\r
         }\r
-        endView->SetVisible(status);\r
-        return;\r
+\r
+        popupView->SetVisible(status);\r
     }\r
     /*获取运动量结束弹窗界面刷新*/\r
     bool TraingCardView::RefreshEndView()\r
@@ -303,6 +356,93 @@ namespace OHOS
         }\r
         return momentumFlag;\r
     }\r
+\r
+    /*初始化动画以及Taglabel*/\r
+    void TraingCardView::InitImageAnimatorSource()\r
+    {\r
+        int tag = TraingModel::GetInstance()->GetSportTag();\r
+        ExerciseTag tagType = TraingModel::GetInstance()->GetSportTagtype();\r
+        std::string tagString = std::to_string(tag);\r
+        switch (tagType)\r
+        {\r
+        case ExerciseTag::Duration:\r
+        {\r
+            int hours = tag / 60;\r
+            int minutes = tag % 60;\r
+            int seconds = 0;\r
+            // 将小时、分钟、秒转换为字符串,并在小于10时补零\r
+            std::string hoursStr = (hours < 10) ? "0" + std::to_string(hours) : std::to_string(hours);\r
+            std::string minutesStr = (minutes < 10) ? "0" + std::to_string(minutes) : std::to_string(minutes);\r
+            std::string secondsStr = (seconds < 10) ? "0" + std::to_string(seconds) : std::to_string(seconds);\r
+            tagString = hoursStr + ":" + minutesStr + ":" + secondsStr;\r
+            break;\r
+        }\r
+        case ExerciseTag::Calories:\r
+        {\r
+            tagString = tagString + "kcal";\r
+            break;\r
+        }\r
+        case ExerciseTag::Distance:\r
+        {\r
+            tagString = tagString + "km";\r
+            break;\r
+        }\r
+        case ExerciseTag::STEP:\r
+            break;\r
+        default:\r
+            break;\r
+        }\r
+        PRINT("tag[%d]-tagType[%d]-tagString[%s]\r\n", tag, tagType, tagString.c_str());\r
+        TraingModel::GetInstance()->InitLabel(labeltag, 70, 215, 326, 97, "label2", tagString.c_str(), DEFAULT_VECTOR_FONT_FILENAME, 80);\r
+        labeltag->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff));\r
+        getView->Add(labeltag);\r
+\r
+        // 初始化图片数组以及动画\r
+        const char *basePath = "/user/res/Training/training_GIF/win/";\r
+        const char *fileExtension = "bin";\r
+        const char **imagePaths = TraingModel::GetInstance()->CreateImagePathsArray(basePath, fileExtension, 94);\r
+        TraingModel::GetInstance()->InitImageAnimatorSource(imageAnimator, imagePaths, 94, 173, 100, 120, 120, "imageAnimator1", 10);\r
+        getView->Add(imageAnimator);\r
+    }\r
+\r
+    /*目标达成展示*/\r
+    void TraingCardView::ShowGetTagView()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowGetTagView");\r
+        getView = new UIScrollView();\r
+        if (getView == nullptr)\r
+        {\r
+            return;\r
+        }\r
+        getView->SetPosition(0, 0);\r
+        getView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
+        getView->SetScrollBlankSize(20);\r
+        getView->SetReboundSize(50);\r
+        getView->SetDirection(1);\r
+\r
+        // 初始化Lable\r
+        TraingModel::GetInstance()->InitLabel(labeltitle, 83, 50, 300, 35, "label1", "目标已达成", DEFAULT_VECTOR_FONT_FILENAME, 35);\r
+        getView->Add(labeltitle);\r
+        getView->Add(labeltag);\r
+        TraingModel::GetInstance()->InitLabel(labelgettag, 103, 307, 200, 35, "label3", "完成目标", DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+        getView->Add(labelgettag);\r
+        TraingModel::GetInstance()->InitLabel(labelpre, 233, 307, 160, 35, "label3", "100%", DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+        getView->Add(labelpre);\r
+\r
+        // 初始化按键\r
+        TraingModel::GetInstance()->InitButtonExt(buttonok_, 0, 366, 466, 100, BUTTONWINOK, STR_OK, 30);\r
+        buttonok_->SetImageSrc(BUTTONOK_IMAGE, BUTTONOK_IMAGE);\r
+        buttonok_->SetOnClickListener(static_cast<UIView::OnClickListener *>(TraingCardPresenter::GetInstance()));\r
+        getView->Add(buttonok_);\r
+\r
+        InitImageAnimatorSource();\r
+        RootView::GetInstance()->Add(getView);\r
+        getView->SetDraggable(false);\r
+        getView->SetTouchable(true);\r
+        getView->SetVisible(false); // 界面隐藏\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowGetTagView end");\r
+    }\r
+\r
     /*获取卡片View单例*/\r
     UIView *TraingCardView::GetTraingCrad()\r
     {\r
@@ -331,4 +471,8 @@ namespace OHOS
     {\r
         return swipe_->GetCurrentPageId(0); // 获取水平页面\r
     }\r
+    UIImageAnimatorView *TraingCardView::GetAnimator()\r
+    {\r
+        return imageAnimator;\r
+    }\r
 }\r
index 6f024f9..4adba24 100644 (file)
@@ -142,9 +142,9 @@ namespace OHOS
         };\r
 \r
         ImageInfo images[] = {\r
-            {image1, TRAINING_WALKING_BIG, 126, 298, "image3"},\r
+            {image1, TRAINING_WALKING_BIG, 126, 148, "image3"},\r
             {image2, TRAINING_RIDING_BIG2, 276, 148, "image2"},\r
-            {image3, TRAINING_RUNNING_BIG, 126, 148, "image1"}};\r
+            {image3, TRAINING_RUNNING_BIG, 126, 298, "image1"}};\r
 \r
         for (auto &imageInfo : images)\r
         {\r
index 715a99a..6c7795a 100644 (file)
@@ -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);