// 训练目标类型
enum class ExerciseTag
{
+ Distance,
Duration,
Calories,
- Distance,
STEP,
UNKNOW,
};
end_time = nullptr;
sportType = Exercisetype::FITNESS;
sportId = UIResourceTextId::STR_EXTREME_SPORTS;
- sportTag = ExerciseTag::Duration;
+ sportTag = ExerciseTag::UNKNOW;
}
void Reset()
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();
/*定时器 */
uint32_t GetTrainingTime();
/*设置训练目标类型以及训练目标*/
void SetSportTag(ExerciseTag tagtpye, int tag);
+ /*获取训练目标*/
+ int GetSportTag();
+ /*获取项目目标类型*/
+ ExerciseTag GetSportTagtype();
std::string GetStartTiemStr();
std::string GetEndTiemStr();
// 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)
{
return sportdata->calories;
}
+ /*获取训练目标*/
+ int TraingModel::GetSportTag()
+ {
+ return sportdata->tag;
+ }
+ /*获取训练项目类型*/
+ ExerciseTag TraingModel::GetSportTagtype()
+ {
+ return sportdata->sportTag;
+ }
/*设置时间*/
void TraingModel::SetTimestamp()
{
{
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)
{
/*设置训练目标类型以及训练目标*/
void TraingModel::SetSportTag(ExerciseTag tagtpye, int tag)
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tagtpye[%d] tag[%d]", tagtpye, tag);
sportTag_ = tagtpye;
tag_ = tag;
}
{\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
*/\r
const char *TraingSetPresenter::GetButtonIdFromCard(int cardID)\r
{\r
- PRINT("GetButtonIdFromCard:%d\r\n", cardID);\r
switch (cardID)\r
{\r
case SET_DURATION:\r
*/\r
ExerciseTag TraingSetPresenter::GetExerciseTagFromCard(int cardID)\r
{\r
- PRINT("GetExerciseTagFromCard:%d\r\n", cardID);\r
+ ;\r
switch (cardID)\r
{\r
case SET_DURATION:\r
*/\r
int TraingSetPresenter::GetTagFromCard(int cardID)\r
{\r
- PRINT("GetTagFromCard:%d\r\n", cardID);\r
switch (cardID)\r
{\r
case SET_DURATION:\r
// 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/";
// 因为继承了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
{\r
#define BUTTONEXIT "button_exit"\r
#define BUTTONBACK "button_back"\r
+#define BUTTONWINOK "buttom_win"\r
\r
enum Control_Card\r
{\r
DATA,\r
MUSIC\r
};\r
-\r
+ enum PopupType\r
+ {\r
+ EndPopup,\r
+ GetTagPopup\r
+ };\r
class TraingCardPresenter;\r
class TrainingControlView;\r
class TrainingDataView;\r
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
\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
+/***
+ * @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
#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
\r
TraingCardPresenter::~TraingCardPresenter()\r
{\r
-\r
+ // tag_ = 0;\r
g_pTraingCardPresenter = nullptr;\r
}\r
\r
void TraingCardPresenter::OnStart()\r
{\r
Presenter<TraingCardView>::OnStart();\r
- ScreenAlwaysOnCtr(1); // 长亮屏\r
+ // ScreenAlwaysOnCtr(1); // 长亮屏\r
}\r
\r
void TraingCardPresenter::OnPause(void)\r
/*开启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
default:\r
break;\r
}\r
+ opensensorstuats = true;\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OpenSensor--%d!!", type);\r
return true;\r
}\r
{\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
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
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
{\r
ControlSensor(ExerciseState::Pause);\r
// 弹窗显示是否结束\r
- TraingCardView::GetInstance()->SetEndViewStatus(true);\r
+ TraingCardView::GetInstance()->SetPopupViewStatus(EndPopup, true);\r
TraingCardView::GetInstance()->RefreshEndView();\r
}\r
// 退出按键\r
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
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
/* 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
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
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
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
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
}\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
{\r
return swipe_->GetCurrentPageId(0); // 获取水平页面\r
}\r
+ UIImageAnimatorView *TraingCardView::GetAnimator()\r
+ {\r
+ return imageAnimator;\r
+ }\r
}\r
};\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
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);