增加血氧
authorCaisking <3449750381@qq.com>
Sun, 3 Mar 2024 02:48:29 +0000 (10:48 +0800)
committerCaisking <3449750381@qq.com>
Sun, 3 Mar 2024 02:48:29 +0000 (10:48 +0800)
41 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp
code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodPresenter.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodTestView.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodWarnView.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodNoteView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodOxygenView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodPresenter.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodTestView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodWarnView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodBandoffView.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenPresenter.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenView.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodResultView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodBandoffView.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/BloodCardView.h [moved from code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodCardView.h with 94% similarity]
code/sdk/application/wearable/fd230app/nativeui/heart_blood/include/HeartCardView.h [moved from code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodNoteView.h with 100% similarity]
code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp [moved from code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodCardView.cpp with 79% similarity]
code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/HeartCardView.cpp [moved from code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodOxygenView.h with 100% similarity]
code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelHeartRate.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/OnDialDataUpdateListener.h
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelHeartRate.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/parser/DialBinParser.h
code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp
code/sdk/application/wearable/service/msg_center/CMakeLists.txt
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_HEART.bin [new file with mode: 0644]

index 4cd279d..5283292 100644 (file)
@@ -135,6 +135,8 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodBandoffView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodCheckView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodResultView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bluetooth/src/BluetoothDeviceCaseListAdapter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bluetooth/src/BluetoothDeviceListView.cpp
@@ -234,8 +236,8 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/settings/src/SettingItemView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/key/src/KeyInputListener.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/screennotify/src/ui_screennotify.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/blood/src/BloodCardView.cpp
-    
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/src/BloodCardView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heart_blood/src/HeartCardView.cpp
 
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/traing/src/TraingView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/language/LanguageInit.cpp
index 41701dd..fc43f56 100644 (file)
@@ -27,10 +27,10 @@ typedef enum : uint16_t
 {
     VIEW_INVALID = 0, // 无效视图
     /* ----------------------------- 每一个id对应一个slice ----------------------------- */
-    VIEW_MAIN = 1,                // 主界面
-    VIEW_SETTING,                 // 设置
-    VIEW_APPLIST,                 // App应用
-    VIEW_DIALUPDATE,              // 更新表盘ID ,请不要在前面增加任何Slice
+    VIEW_MAIN = 1,   // 主界面
+    VIEW_SETTING,    // 设置
+    VIEW_APPLIST,    // App应用
+    VIEW_DIALUPDATE, // 更新表盘ID ,请不要在前面增加任何Slice
     /* -------------------------------------------------------------------------- */
     VIEW_MAIN_ALARM,              // 闹钟
     VIEW_ALARM_POP_UP,            // 闹铃界面
@@ -38,7 +38,6 @@ typedef enum : uint16_t
     VIEW_CLASSIC_BLUETOOTH,       // 经典蓝牙
     VIEW_CALLER_LOG,              // 通话记录界面
     VIEW_INCOMING_CALL,           // 来电界面
-    VIEW_BLOODOXY,                // 血氧饱和度界面
     VIEW_COMPASS,                 // 指南针界面
     VIEW_CONNECT_PHONE,           // 连接手机界面
     VIEW_INDOORWALK,              // 室内步行
@@ -62,11 +61,13 @@ typedef enum : uint16_t
     VIEW_RECORD_PLAY,
     VIEW_RECORD_DELETE,
     VIEW_RECORD_GOING,
-    /* ---------------------------------- 测试界面 ---------------------------------- */
-    VIEW_DIAL,       // 切换表盘
-    VIEW_MESSAGE,    // 信息通知
-    VIEW_BLOOD,     // 血氧监测
-    VIEW_ROTATE,     // 模拟表冠
+    /* ---------------------------------- 界面 ---------------------------------- */
+    VIEW_DIAL,     // 切换表盘
+    VIEW_MESSAGE,  // 信息通知
+    VIEW_BLOOD,    // 血氧监测
+    VIEW_ROTATE,   // 模拟表冠
+    VIEW_BLOODOXY, // 血氧饱和度界面
+    VIEW_HEART,    // 心率监测
     /* -------------------------------------------------------------------------- */
     VIEW_MAIN_TEMP,     // 体温界面(暂时不用)
     VIEW_OFFLINEVOICE,  // 语音助手界面(暂时不用)
@@ -79,7 +80,8 @@ typedef enum : uint16_t
     VIEW_MAX_INTER_APP,       // 在此之前添加native应用ID.
     VIEW_EXTERN_APP = 0xFFFE, // 三方应用
     VIEW_INVALIDE_APP = 0xFFFF,
-} AppViewId;
+}
+AppViewId;
 
 /*
  * Slice页面优先级,越小优先级越高
index d284cf1..692839c 100644 (file)
@@ -96,53 +96,54 @@ namespace OHOS
     static constexpr const char *PNG_BLOOD_FLOW_IMAGE_29 = APP_RES_PATH "/BLOOD_FLOW_IMAGE_31.bin";
     static constexpr const char *PNG_BLOOD_FLOW_IMAGE_30 = APP_RES_PATH "/BLOOD_FLOW_IMAGE_32.bin";
     /* -------------------------------- 血氧动画 ------------------------------------------------- */
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH"/COUNTDOWN_IMAGE_01.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH"/COUNTDOWN_IMAGE_02.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH"/COUNTDOWN_IMAGE_03.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH"/COUNTDOWN_IMAGE_04.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH"/COUNTDOWN_IMAGE_05.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH"/COUNTDOWN_IMAGE_06.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH"/COUNTDOWN_IMAGE_07.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH"/COUNTDOWN_IMAGE_08.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH"/COUNTDOWN_IMAGE_09.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH"/COUNTDOWN_IMAGE_10.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH"/COUNTDOWN_IMAGE_11.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH"/COUNTDOWN_IMAGE_12.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH"/COUNTDOWN_IMAGE_13.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH"/COUNTDOWN_IMAGE_14.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH"/COUNTDOWN_IMAGE_15.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH"/COUNTDOWN_IMAGE_16.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH"/COUNTDOWN_IMAGE_17.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH"/COUNTDOWN_IMAGE_18.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH"/COUNTDOWN_IMAGE_19.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH"/COUNTDOWN_IMAGE_20.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH"/COUNTDOWN_IMAGE_21.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH"/COUNTDOWN_IMAGE_22.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH"/COUNTDOWN_IMAGE_23.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH"/COUNTDOWN_IMAGE_24.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH "/COUNTDOWN_IMAGE_01.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH "/COUNTDOWN_IMAGE_02.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH "/COUNTDOWN_IMAGE_03.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH "/COUNTDOWN_IMAGE_04.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH "/COUNTDOWN_IMAGE_05.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH "/COUNTDOWN_IMAGE_06.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH "/COUNTDOWN_IMAGE_07.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH "/COUNTDOWN_IMAGE_08.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH "/COUNTDOWN_IMAGE_09.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH "/COUNTDOWN_IMAGE_10.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH "/COUNTDOWN_IMAGE_11.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH "/COUNTDOWN_IMAGE_12.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH "/COUNTDOWN_IMAGE_13.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH "/COUNTDOWN_IMAGE_14.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH "/COUNTDOWN_IMAGE_15.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH "/COUNTDOWN_IMAGE_16.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH "/COUNTDOWN_IMAGE_17.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH "/COUNTDOWN_IMAGE_18.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH "/COUNTDOWN_IMAGE_19.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH "/COUNTDOWN_IMAGE_20.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH "/COUNTDOWN_IMAGE_21.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH "/COUNTDOWN_IMAGE_22.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH "/COUNTDOWN_IMAGE_23.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH "/COUNTDOWN_IMAGE_24.bin";
+
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_0 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_1.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_1 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_2.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_2 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_3.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_3 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_4.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_4 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_5.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_5 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_6.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_6 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_7.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_7 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_8.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_8 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_9.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_9 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_10.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_10 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_11.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_11 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_12.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_12 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_13.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_13 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_14.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_14 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_15.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_15 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_16.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_16 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_17.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_17 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_18.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_18 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_19.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_19 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_20.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_20 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_21.bin";
+    static constexpr const char *PNG_CHECK_TIME_IMAGE_21 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_22.bin";
 #if 0
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_1.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_2.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_3.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_4.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_5.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_6.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_7.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_8.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_9.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_10.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_11.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_12.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_13.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_14.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_15.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_16.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_17.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_18.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_19.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_20.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_21.bin";
-    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_22.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_23.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_24.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_24 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_25.bin";
@@ -285,6 +286,7 @@ namespace OHOS
     /* --------------------------------- AppList -------------------------------- */
     static constexpr const char *PNG_APPLIST_ALARM_IMAGE = APP_RES_PATH "/APPLIST_ALARM.bin";           // 闹钟
     static constexpr const char *PNG_APPLIST_SPO2_IMAGE = APP_RES_PATH "/APPLIST_SPO2.bin";             // 血氧
+    static constexpr const char *PNG_APPLIST_HEART_IMAGE = APP_RES_PATH "/APPLIST_HEART.bin";           // 心率
     static constexpr const char *PNG_APPLIST_SETTING_IMAGE = APP_RES_PATH "/APPLIST_SETTING.bin";       // 设置
     static constexpr const char *PNG_APPLIST_CALLER_IMAGE = APP_RES_PATH "/APPLIST_CALLER_IMAGE.bin";   // 打电话
     static constexpr const char *PNG_APPLIST_COMPASS_IMAGE = APP_RES_PATH "/APPLIST_COMPASS_IMAGE.bin"; // 指南针
index 8cb7a33..2f541eb 100644 (file)
@@ -57,7 +57,7 @@
 #include "UISampleView.h"
 #include "UISamplePresenter.h"
 
-#include "blood/include/BloodCardView.h"
+#include "heart_blood/include/BloodCardView.h"
 
 #include "weather/include/MainWeatherPresenter.h"
 #include "weather/include/MainWeatherView.h"
@@ -370,7 +370,7 @@ namespace OHOS
 
     void NativeLauncher::InitMainBloodOxyView(void)
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitMainBloodOxyView");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitMainBloodOxyView");
         SliceProxy *bloodOxygenView = new AbilitySliceProxy<BloodOxygenView, BloodOxygenPresenter>;
         if (bloodOxygenView == nullptr)
         {
index 62e2ecf..45b6590 100644 (file)
@@ -32,6 +32,7 @@ namespace OHOS
         {VIEW_MAIN_ALIPAY, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_ALIPAY_IMAGE, "支付宝", nullptr},
 #endif
 #if 0
+        {VIEW_HEART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, "心率检测", nullptr},
         {VIEW_MAIN_TEMP, PNG_APPLIST_TEMP_IMAGE, PNG_APPLIST_TEMP_IMAGE, "体温", nullptr},
         {VIEW_CALLER_LOG, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, "通话记录", nullptr},
         {VIEW_OFFLINEVOICE, PNG_APPLIST_VOCASSIST_IMAGE, PNG_APPLIST_VOCASSIST_IMAGE, "语音助手", nullptr},
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodPresenter.h
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodTestView.h b/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodTestView.h
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodWarnView.h b/code/sdk/application/wearable/fd230app/nativeui/blood/include/BloodWarnView.h
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodNoteView.cpp b/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodNoteView.cpp
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodOxygenView.cpp b/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodOxygenView.cpp
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodPresenter.cpp
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodTestView.cpp b/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodTestView.cpp
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodWarnView.cpp b/code/sdk/application/wearable/fd230app/nativeui/blood/src/BloodWarnView.cpp
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
index 52640bf..d579872 100644 (file)
@@ -11,7 +11,7 @@
 #include "BaseView.h"
 #include "View.h"
 #include "ohos_types.h"
-
+#include "components/ui_scroll_view.h"
 namespace OHOS
 {
     class BloodBandoffView
@@ -22,13 +22,13 @@ namespace OHOS
 
         UIViewGroup *CreateUIViewGroup();
         static BloodBandoffView *GetInstance(void);
-
-        UIViewGroup *GetBandoffViewGroup();
+        UIScrollView *BloodBondoffViewInit();
         UIImageAnimatorView *GetImageAnimator();
 
     private:
         UILabel *label;
         UILabelButton *testButton;
+        UIScrollView *BloodBandoffScrollView;
         UIViewGroup *group;
         UIImageView *imageView;
         UIImageAnimatorView *imageAnimator;
diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodCheckView.h
new file mode 100644 (file)
index 0000000..af1c34c
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodCheck view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef BLOOD_Check_VIEW_H
+#define BLOOD_Check_VIEW_H
+
+#include "View.h"
+#include "BaseView.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_label.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_circle_progress.h"
+#include "components/ui_view_group.h"
+#include "BloodOxygenPresenter.h"
+#include "BloodBandoffView.h"
+#include "components/ui_scroll_view.h"
+namespace OHOS
+{
+    class BloodOxygenPresenter;
+    class BloodBandoffView;
+
+    class BloodCheckView : public View<BloodOxygenPresenter>
+    {
+    public:
+        BloodCheckView();
+        virtual ~BloodCheckView();
+        static BloodCheckView *GetInstance(void);
+        UIScrollView *BloodCheckViewInit();
+        UIImageAnimatorView *GetImageAnimator();
+        UILabelButton *CreateAndSetUIButton(const char *title);
+        void UpSpo2Text();
+
+    private:
+        BloodBandoffView *bloodbandoff{nullptr};
+        UIImageAnimatorView *imageAnimator;
+        UILabel *titleLabel;
+        UILabel *Spo2Text;
+        UIScrollView *BloodCheckScrollView;
+        UILabelButton *testButton;
+    };
+}
+
+#endif // 血氧主界面
\ No newline at end of file
index 1d3ea53..9ee3afe 100644 (file)
 #include "gfx_utils/list.h"
 #include "los_mux.h"
 
-namespace OHOS {
-class BloodOxygenModel {
-public:
-    ~BloodOxygenModel(){};
-    static BloodOxygenModel *GetInstance(void);
-    bool GetBloodOxygenViewStatus(void);
-    bool GetBloodBandoffViewStatus(void);
-    void SetBloodOxygenViewStatus(bool oxygenViewStatus);
-    void SetBloodBandoffViewStatus(bool bandoffViewStatus);
+namespace OHOS
+{
+    class BloodOxygenModel
+    {
+    public:
+        ~BloodOxygenModel(){};
+        static BloodOxygenModel *GetInstance(void);
+        bool GetBloodOxygenViewStatus(void);
+        bool GetBloodBandoffViewStatus(void);
+        bool GetBloodCheckViewStatus(void);
+        void SetBloodOxygenViewStatus(bool oxygenViewStatus);
+        void SetBloodBandoffViewStatus(bool bandoffViewStatus);
+        void SetBloodCheckViewStatus(bool checkViewStatus);
 
-private:
-    BloodOxygenModel();
-    bool OxygenView;
-    bool BandoffView;
-};
+        bool GetCheckStatus();
+        void SetCheckStatus(bool checkstatus);
+        void UpSPO2data(uint16_t spo2);
+        uint16_t GetSPO2data();
+
+    private:
+        BloodOxygenModel();
+        bool OxygenView;
+        bool BandoffView;
+        bool CheckView;
+        bool ResultView;
+        bool CheckStatus; // 检测状态标志
+        uint16_t SPO2_;   // 血氧
+    };
 }
 
 #endif
index ecdfc36..3decd68 100644 (file)
 #include "ohos_types.h"
 #include "KeyInputListener.h"
 #include "common/key_code.h"
-#include "power_display_service.h"
+
 namespace OHOS
 {
+
+    typedef enum
+    {
+        BLOODVIEW = 0,  // 血氧视图(slice)
+        BLOODBANDVIEW,  // 佩戴视图(subView)
+        BLOODCHECKVIEW, // 检测视图(subView)
+        BLOODRESULT,    // 测试失败(subView)
+        MAX_BLOODVIEW,
+    } BLOODVIEWID;
+
     class BloodOxygenView;
     class BloodOxygenPresenter : public Presenter<BloodOxygenView>,
                                  public UIView::OnClickListener,
@@ -35,6 +45,7 @@ namespace OHOS
         virtual void Notify() override;
         static BloodOxygenPresenter *GetInstance(void);
         bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnDragEnd(UIView &view, const DragEvent &event) override;
         bool OnClick(UIView &view, const ClickEvent &event) override;
         bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
 
@@ -43,9 +54,8 @@ namespace OHOS
         void ReturnInterface(void);
         void ProgressNotify(void);
         int count;
+        bool startspo2 = true;
         KeyInputListener *keyActListenr{nullptr};
-        const power_display_svr_api_t *display_api = power_display_svr_get_api();
-        int display_time;
     };
 }
 
index 6c96788..79fc59d 100644 (file)
 #include "components/ui_image_animator.h"
 #include "components/ui_circle_progress.h"
 #include "components/ui_view_group.h"
+#include "components/ui_scroll_view.h"
 #include "BloodOxygenPresenter.h"
 #include "BloodBandoffView.h"
+#include "BloodCheckView.h"
+#include "BloodResultView.h"
+#include "power_display_service.h"
+namespace OHOS
+{
+    class BloodOxygenPresenter;
+    class BloodBandoffView;
+    class BloodCheckView;
+    class BloodResultView;
+    class BloodOxygenView : public View<BloodOxygenPresenter>
+    {
+    public:
+        BloodOxygenView();
+        virtual ~BloodOxygenView();
 
-namespace OHOS {
-class BloodOxygenView : public View<BloodOxygenPresenter> {
-public:
-    BloodOxygenView();
-    virtual ~BloodOxygenView();
-
-    void OnStop() override;
-    void OnSetUpView() override;
-    void OnTearDownView() override;
-    void OnStart() override;
-
-    static BloodOxygenView *GetInstance(void);
-
-    UILabel *GetPercent();
-    UIViewGroup *GetBloodOxygenGroup();
-    UILabelButton *GetTestButton();
-    UICircleProgress *GetCircleProgress();
-private:
-    bool InitImageDisplay();
-    bool SetOnDragListener();
-    UICircleProgress *CreateAndSetUICircleProgress();
-    UILabelButton *CreateAndSetUIButton(const char *title);
-    UIView *CreateAndSetUIView(int16 x, int16 y) const;
-
-    BloodBandoffView *bloodbandoff{nullptr};
-    UIImageView *imageViewMain;
-    UIImageView *imageViewProgress;
-    UIImageAnimatorView *imageAnimator;
-
-    UILabel *percent;
-    UIViewGroup *group;
-    UILabelButton *testButton;
-    UICircleProgress *circleProgress;
-};
-}
+        void OnStop() override;
+        void OnSetUpView() override;
+        void OnTearDownView() override;
+        void OnStart() override;
+        static BloodOxygenView *GetInstance(void);
+        bool ChangeBloodView(int16_t thisview); // 主视图
+        bool ChangeBandoffView(int16_t thisview);
+        bool ChangeCheckView(int16_t thisview);
+        bool ChangeResultView(int16_t thisview);
+
+        bool ClickFunc(int16_t interface);
+        void ChangeView(int16_t hideView, int16_t showView);
+        UIScrollView *GetBloodScrollView(int ViewId);
+        void Upspo2data();
+    private:
+        // 增加图片
+        bool InitImageDisplay(void);
+        // 初始化标签
+        bool InitLabel(void);
+        // 添加label按键
+        UILabelButton *CreateAndSetUIButton(const char *title);
+        // 初始化界面
+        bool InitBloodView(void);
+        bool SetOnDragListener(void);
+
+        BloodBandoffView *bloodbandoff{nullptr};
+        BloodCheckView *bloodcheck{nullptr};
+        BloodResultView *bloodresult{nullptr};
+        UIScrollView *BloodScrollView[4]{nullptr};
 
+        UIViewGroup *group;
+        UIImageView *imageViewMain; // 背景图片
+        UILabel *percent;           // 心率值
+        UILabel *timeLabel;         // 检测时间
+        UILabel *titleLabel;        // 页面title
+        UILabelButton *testButton;  // 检测按键
+
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        uint32_t display_time;
+        uint32_t spo2_;
+    };
+}
 
-#endif  // 血氧主界面
\ No newline at end of file
+#endif // 血氧主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodResultView.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodResultView.h
new file mode 100644 (file)
index 0000000..065e56f
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodResult view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef BLOOD_Result_VIEW_H
+#define BLOOD_Result_VIEW_H
+
+#include "View.h"
+#include "BaseView.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_label.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_circle_progress.h"
+#include "components/ui_view_group.h"
+#include "BloodOxygenPresenter.h"
+#include "BloodBandoffView.h"
+#include "components/ui_scroll_view.h"
+namespace OHOS
+{
+    class BloodOxygenPresenter;
+    class BloodBandoffView;
+
+    class BloodResultView : public View<BloodOxygenPresenter>
+    {
+    public:
+        BloodResultView();
+        virtual ~BloodResultView();
+        static BloodResultView *GetInstance(void);
+        UIScrollView *BloodResultViewInit();
+    private:
+        // 增加图片
+        bool InitImageDisplay(void);
+        // 初始化标签
+        bool InitLabel(void);
+        BloodResultView *bloodresult{nullptr};
+        UIImageView *imageerror; // 图片
+        UILabel *titlelabel;
+        UILabel *label1;
+        UILabel *label2;
+        UILabel *label3;
+
+        UIScrollView *BloodResultScrollView;
+        UILabelButton *ReButton;
+        UILabelButton *StButton;
+    };
+}
+
+#endif // 血氧主界面
\ No newline at end of file
index 8715776..2905c90 100644 (file)
@@ -1,239 +1,4 @@
 
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodBandoff view
- * Author:
- * Create: 2021-08-01
- */
-#if 0
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "BloodBandoffView.h"
-#include "BloodOxygenModel.h"
-
-namespace OHOS
-{
-    // 动态显示图片设置
-    static constexpr uint16_t IMAGE_SIZE = 180;
-    static constexpr uint16_t IMAGE_POSITION_Y = 134;
-    static constexpr uint16_t IMAGE_POSITION_X = 150;
-    static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 90;
-    static constexpr uint16_t IMAGEANIMATOERVIEW_SPEED = 30;
-
-    // 标签设置
-    static constexpr uint16_t LABEL_POSITION_X = 173;
-    static constexpr uint16_t LABEL_POSITION_Y = 52;
-    static constexpr uint16_t LABEL_POSITION_WIDTH = 120;
-    static constexpr uint16_t LABEL_POSITION_HEIGHT = 35;
-
-    // 图片设置
-    static constexpr uint16_t IMAGE_ENTER_POSITION_X = 131;
-    static constexpr uint16_t IMAGE_ENTER_POSITION_Y = 70;
-
-    static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;
-    static constexpr uint16_t FONT_DEFAULT_SIZE = 30;
-    static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;
-    static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;
-    static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;
-
-    static ImageAnimatorInfo g_imageAnimatorInfo_Time[IMAGEANIMATOERVIEW_SIZE] = {
-        {PNG_COUNTDOWN_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_24, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_25, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_26, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_27, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_28, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_29, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_30, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_31, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_32, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_33, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_34, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_35, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_36, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_37, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_38, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_39, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_40, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_41, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_42, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_43, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_44, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_45, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_46, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_47, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_48, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_49, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_50, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_51, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_52, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_53, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_54, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_55, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_56, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_57, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_58, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_59, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_60, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_61, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_62, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_63, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_64, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_65, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_66, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_67, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_68, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_69, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_70, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_71, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_72, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_73, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_74, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_75, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_76, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_77, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_78, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_79, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_80, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_81, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_82, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_83, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_84, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_85, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_86, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_87, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_88, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_89, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-    };
-    static BloodBandoffView *g_pMainView = nullptr;
-    BloodBandoffView::BloodBandoffView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
-        label = nullptr;
-        imageView = nullptr;
-        group = nullptr;
-        imageAnimator = nullptr;
-        g_pMainView = this;
-    }
-
-    BloodBandoffView::~BloodBandoffView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::~BloodBandoffView");
-        group->RemoveAll();
-        delete label;
-        delete imageView;
-        delete group;
-        delete imageAnimator;
-        label = nullptr;
-        imageView = nullptr;
-        group = nullptr;
-        imageAnimator = nullptr;
-        g_pMainView = nullptr;
-    }
-
-    BloodBandoffView *BloodBandoffView::GetInstance(void)
-    {
-        return g_pMainView;
-    }
-
-    UIViewGroup *BloodBandoffView::GetBandoffViewGroup()
-    {
-        return group;
-    }
-
-    UIImageAnimatorView *BloodBandoffView::GetImageAnimator()
-    {
-        return imageAnimator;
-    }
-
-    UIViewGroup *BloodBandoffView::CreateUIViewGroup()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::CreateUIViewGroup");
-        group = new UIViewGroup();
-        if (group == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new group fail");
-            return nullptr;
-        }
-        group->SetPosition(0, 0);
-        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
-
-        label = new UILabel();
-        if (label == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new Label fail");
-            return nullptr;
-        }
-        group->Add(label);
-        label->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
-        label->SetText("正在检测");
-        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-        label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-
-        imageAnimator = new UIImageAnimatorView();
-        if (imageAnimator == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");
-            return nullptr;
-        }
-        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);
-        imageAnimator->Start();
-        imageAnimator->SetRepeat(false);
-        group->Add(imageAnimator);
-
-        if (testButton == nullptr)
-        {
-            testButton = new UILabelButton();
-        }
-        testButton->SetPosition(118, 336);    // widget's left position and top position
-        testButton->Resize(230, 80);          // widget's width and height
-        testButton->SetViewId("labelButton"); // Set style
-        testButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-
-        // Set additional property
-        testButton->SetText("停止检测");
-        testButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 26);
-        testButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
-        group->Add(testButton);
-
-#if 0
-    imageView = new UIImageView();
-    if (imageView == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageView fail");
-        return nullptr;
-    }
-    imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset
-    imageView->SetSrc(PNG_BLOOD_ICON_ENTER);
-    group->Add(imageView);
-#endif
-        return group;
-    }
-}
-#endif
-
 /*
  * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
  * Description: bloodBandoff view
@@ -302,7 +67,7 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
         label = nullptr;
         imageView = nullptr;
-        group = nullptr;
+        BloodBandoffScrollView = nullptr;
         imageAnimator = nullptr;
         g_pMainView = this;
     }
@@ -310,14 +75,14 @@ namespace OHOS
     BloodBandoffView::~BloodBandoffView()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::~BloodBandoffView");
-        group->RemoveAll();
+        BloodBandoffScrollView->RemoveAll();
         delete label;
         delete imageView;
-        delete group;
         delete imageAnimator;
         label = nullptr;
         imageView = nullptr;
-        group = nullptr;
+        delete BloodBandoffScrollView;
+        BloodBandoffScrollView = nullptr;
         imageAnimator = nullptr;
         g_pMainView = nullptr;
     }
@@ -327,61 +92,65 @@ namespace OHOS
         return g_pMainView;
     }
 
-    UIViewGroup *BloodBandoffView::GetBandoffViewGroup()
-    {
-        return group;
-    }
-
+    // 返回动画状态
     UIImageAnimatorView *BloodBandoffView::GetImageAnimator()
     {
         return imageAnimator;
     }
 
-    UIViewGroup *BloodBandoffView::CreateUIViewGroup()
+    UIScrollView *BloodBandoffView::BloodBondoffViewInit()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::CreateUIViewGroup");
-        group = new UIViewGroup();
-        if (group == nullptr)
+        // 初始化界面
+        BloodBandoffScrollView = new UIScrollView();
+        if (BloodBandoffScrollView == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new group fail");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBondoffViewInit::BloodBandoffView new fail!");
+            // return nullptr;
         }
-        group->SetPosition(0, 0);
-        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+        BloodBandoffScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        BloodBandoffScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        BloodBandoffScrollView->SetStyle(STYLE_BORDER_RADIUS, 1294);
+        BloodBandoffScrollView->SetScrollBlankSize(35);
+        BloodBandoffScrollView->SetReboundSize(50);
+        BloodBandoffScrollView->SetDirection(1);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::CreateUIViewGroup");
 
+        // 佩戴title
         label = new UILabel();
         if (label == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new Label fail");
-            return nullptr;
+            // return nullptr;
         }
-        group->Add(label);
         label->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
         label->SetText("偏紧佩戴,保持静止");
         label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
         label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        BloodBandoffScrollView->Add(label);
 
+        // 播放动画
         imageAnimator = new UIImageAnimatorView();
         if (imageAnimator == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");
-            return nullptr;
+            // return nullptr;
         }
         imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);
         imageAnimator->Start();
         imageAnimator->SetRepeat(false);
-        group->Add(imageAnimator);
+        BloodBandoffScrollView->Add(imageAnimator);
 
+        // 提醒图片
         imageView = new UIImageView();
         if (imageView == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageView fail");
-            return nullptr;
+            // return nullptr;
         }
         imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset
         imageView->SetSrc(PNG_BLOOD_ICON_ENTER);
-        group->Add(imageView);
+        BloodBandoffScrollView->Add(imageView);
 
-        return group;
+        return BloodBandoffScrollView;
     }
 }
diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp
new file mode 100644 (file)
index 0000000..66cd263
--- /dev/null
@@ -0,0 +1,172 @@
+
+
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "BloodCheckView.h"
+#include "BloodOxygenModel.h"
+#include "ui_image_animator.h"
+#include "BloodCheckView.h"
+namespace OHOS
+{
+    // 动态刷新设置
+    static constexpr uint16_t IMAGE_SIZE = 180;
+    static constexpr uint16_t IMAGE_POSITION_Y = 134;
+    static constexpr uint16_t IMAGE_POSITION_X = 150;
+    static constexpr uint16_t CHECKIMAGEANIMATORVIEW_SIZE = 20;
+    static constexpr uint16_t CHECKIMAGEANIMATORVIEW_SPEED = 40;
+
+    static ImageAnimatorInfo g_imageAnimatorInfo_Time[20] = {
+        {PNG_CHECK_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    };
+
+    static BloodCheckView *g_pMainView = nullptr;
+    BloodCheckView::BloodCheckView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
+        titleLabel = nullptr;
+        BloodCheckScrollView = nullptr;
+        imageAnimator = nullptr;
+        testButton = nullptr;
+        g_pMainView = this;
+    }
+
+    BloodCheckView *BloodCheckView::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    UIImageAnimatorView *BloodCheckView::GetImageAnimator()
+    {
+        return imageAnimator;
+    }
+
+    BloodCheckView::~BloodCheckView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodCheckView::~BloodCheckView");
+        BloodCheckScrollView->RemoveAll();
+        delete titleLabel;
+        delete testButton;
+        delete BloodCheckScrollView;
+        delete imageAnimator;
+        delete Spo2Text;
+        titleLabel = nullptr;
+        BloodCheckScrollView = nullptr;
+        imageAnimator = nullptr;
+        testButton = nullptr;
+        Spo2Text = nullptr;
+        g_pMainView = this;
+    }
+    void BloodCheckView::UpSpo2Text()
+    {
+        uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
+        //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_);
+        std::string bloodoxygenStr = std::to_string(spo2_);
+        Spo2Text->SetText(bloodoxygenStr.c_str());
+    }
+    UIScrollView *BloodCheckView::BloodCheckViewInit()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodCheckView::CreateUIViewBloodCheckScrollView");
+        BloodCheckScrollView = new UIScrollView();
+        if (BloodCheckScrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new BloodCheckScrollView fail");
+            return nullptr;
+        }
+        BloodCheckScrollView->SetPosition(0, 0);
+        BloodCheckScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+        /* -------------------------------------------------------------------------- */
+        titleLabel = new UILabel();
+        if (titleLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new titleLabel fail");
+            return nullptr;
+        }
+        titleLabel->SetPosition(175, 55); // widget's left position and top position
+        titleLabel->Resize(200, 90);      // widget's width and height
+        titleLabel->SetViewId("label3");  // Set style
+        titleLabel->SetStyle(STYLE_TEXT_FONT, 28);
+        titleLabel->SetText("正在检测");
+        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        titleLabel->SetRollSpeed(0);
+        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
+        BloodCheckScrollView->Add(titleLabel);
+        /* -------------------------------------------------------------------------- */
+
+        imageAnimator = new UIImageAnimatorView();
+        if (imageAnimator == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");
+            return nullptr;
+        }
+        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, CHECKIMAGEANIMATORVIEW_SIZE, CHECKIMAGEANIMATORVIEW_SPEED);
+        imageAnimator->SetRepeatTimes(20);
+        imageAnimator->SetRepeat(false);
+        imageAnimator->Start();
+        BloodCheckScrollView->Add(imageAnimator);
+        /* -------------------------------------------------------------------------- */
+        if (testButton == nullptr)
+        {
+            testButton = new UILabelButton();
+        }
+        testButton->SetPosition(118, 336);    // widget's left position and top position
+        testButton->Resize(230, 80);          // widget's width and height
+        testButton->SetViewId("labelButton"); // Set style
+        testButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+
+        // Set additional property
+        testButton->SetText("停止检测");
+        testButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        testButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+        testButton->SetViewId("checkstop");
+        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (clickLeftListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new clickLeftListener fail");
+            return nullptr;
+        }
+        testButton->SetOnClickListener(clickLeftListener);
+        BloodCheckScrollView->Add(testButton);
+        /* -------------------------------------------------------------------------- */
+        Spo2Text = new UILabel();
+        if (Spo2Text == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Spo2Text fail");
+            return nullptr;
+        }
+        Spo2Text->SetPosition(133, 110); // widget's left position and top position
+        Spo2Text->Resize(200, 200);      // widget's width and height
+        Spo2Text->SetViewId("label");    // Set style
+        Spo2Text->SetStyle(STYLE_TEXT_FONT, 140);
+        uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_);
+        std::string bloodoxygenStr = std::to_string(spo2_);
+        Spo2Text->SetText(bloodoxygenStr.c_str());
+        Spo2Text->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        Spo2Text->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        Spo2Text->SetRollSpeed(0);
+        Spo2Text->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 140);
+        BloodCheckScrollView->Add(Spo2Text);
+        /* -------------------------------------------------------------------------- */
+        return BloodCheckScrollView;
+    }
+}
index 9e2eea3..8cd73be 100644 (file)
@@ -6,13 +6,19 @@
  */
 
 #include "BloodOxygenModel.h"
-
+#include "DialModelSPO2.h"
+#include "wearable_log.h"
 namespace OHOS
 {
     BloodOxygenModel::BloodOxygenModel()
     {
         OxygenView = false;
         BandoffView = false;
+        CheckView = false;
+        ResultView = false;
+        CheckStatus = false;
+        // 初始化血氧值
+        SPO2_ = DialModelSPO2::GetInstance()->GetSPO2Data();
     }
 
     bool BloodOxygenModel::GetBloodOxygenViewStatus(void)
@@ -25,6 +31,11 @@ namespace OHOS
         return BandoffView;
     }
 
+    bool BloodOxygenModel::GetBloodCheckViewStatus(void)
+    {
+        return CheckView;
+    }
+
     void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus)
     {
         BandoffView = bandoffViewStatus;
@@ -35,6 +46,33 @@ namespace OHOS
         OxygenView = oxygenViewStatus;
     }
 
+    void BloodOxygenModel::SetBloodCheckViewStatus(bool checkViewStatus)
+    {
+        CheckView = checkViewStatus;
+    }
+
+    /* -------------------------------------------------------------------------- */
+    // 获取检测状态
+    bool BloodOxygenModel::GetCheckStatus()
+    {
+        return CheckStatus;
+    }
+    // 设置检测状态
+    void BloodOxygenModel::SetCheckStatus(bool checkstatus)
+    {
+        CheckStatus = checkstatus;
+    }
+    uint16_t BloodOxygenModel::GetSPO2data()
+    {
+        return SPO2_;
+    }
+    void BloodOxygenModel::UpSPO2data(uint16_t spo2)
+    {
+        //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpSPO2data SPO2:%d->%d", SPO2_, spo2);
+        SPO2_ = spo2;
+    }
+    /* -------------------------------------------------------------------------- */
+
     BloodOxygenModel *BloodOxygenModel::GetInstance(void)
     {
         static BloodOxygenModel instance;
index 787c6fe..673e7c1 100644 (file)
@@ -9,6 +9,7 @@
 #include "common/task_manager.h"
 #include "BloodOxygenView.h"
 #include "BloodOxygenModel.h"
+#include "BloodCheckView.h"
 #include "components/ui_label.h"
 #include "BloodBandoffView.h"
 #include "ChangeSliceListener.h"
 #include "ppg_service.h"
 #include "displaybrightness/include/DisplayBrightnessModel.h"
 #include "power_display_service.h"
+
+#define BLOODKEYABLE 0
 namespace OHOS
 {
     static BloodOxygenPresenter *g_pMainView = nullptr;
+    BloodOxygenView *g_pbloodview = BloodOxygenView::GetInstance();
+
     static constexpr uint16_t PROGRESS_VALUE_MIN = 0;
-    static constexpr uint16_t PROGRESS_VALUE_MAX = 100;
+    static constexpr uint16_t PROGRESS_VALUE_MAX = 10;
 
     BloodOxygenPresenter::BloodOxygenPresenter()
     {
-        count = PROGRESS_VALUE_MAX;
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::new BloodOxygenPresenter");
         g_pMainView = this;
     }
 
     BloodOxygenPresenter::~BloodOxygenPresenter()
     {
+#if BLOODKEYABLE
         if (keyActListenr != nullptr)
         {
             delete keyActListenr;
             keyActListenr = nullptr;
         }
+#endif
         g_pMainView = nullptr;
     }
     BloodOxygenPresenter *BloodOxygenPresenter::GetInstance()
@@ -60,7 +66,7 @@ namespace OHOS
     {
         Presenter<BloodOxygenView>::OnStart();
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::On Start ");
-#if 0
+#if BLOODKEYABLE
         if (keyActListenr == nullptr)
         {
             keyActListenr = new KeyInputListener();
@@ -100,53 +106,62 @@ namespace OHOS
         }
         return true;
     }
-
     bool BloodOxygenPresenter::OnDrag(UIView &view, const DragEvent &event)
     {
-        UNUSED(view);
+        return true;
+    }
+    bool BloodOxygenPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
         {
-            BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(false);
-            BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(true);
             NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            return true;
         }
         return false;
     }
 
     bool BloodOxygenPresenter::OnClick(UIView &view, const ClickEvent &event)
     {
-        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
-        display_api->set_screen_auto_off_timeout(30 * 1000);
         UNUSED(view);
         UNUSED(event);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::OnClick");
-        if (CheckPointersValue() == false)
+        // 主界面点击开始检测
+        if (strcmp(view.GetViewId(), "checkbegin") == 0)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::Pointers is empty");
-            return false;
+            BloodOxygenView::GetInstance()->ChangeView(BLOODVIEW, BLOODBANDVIEW);
+            BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(true);
+            BloodBandoffView::GetInstance()->GetImageAnimator()->Start();
+            return true;
         }
-        BloodOxygenView::GetInstance()->GetPercent()->SetText("");
-        BloodOxygenView::GetInstance()->GetBloodOxygenGroup()->SetVisible(false);
-        BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(true);
-        BloodBandoffView::GetInstance()->GetImageAnimator()->Stop();
-#ifdef SUPPORT_SPO2_NOTIFICATION
-        uint32_t md = PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST;
-        send_ppg_cmd_msg(md);
-        // 增加测试时间,大概20秒,测试期间,循环播放
-        BloodBandoffView::GetInstance()->GetImageAnimator()->SetRepeatTimes(20);
-#else
-        BloodBandoffView::GetInstance()->GetImageAnimator()->SetRepeatTimes(1);
-#endif
-        BloodBandoffView::GetInstance()->GetImageAnimator()->Start();
-        BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(true);
-        BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(false);
-        return true;
+        // 从检测界面回到主界面
+        if (strcmp(view.GetViewId(), "checkstop") == 0)
+        {
+            BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODVIEW);
+            BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false);
+            BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测
+            return true;
+        }
+        // 从检测失败界面回到检测界面
+        if (strcmp(view.GetViewId(), "ReCheck") == 0)
+        {
+            BloodOxygenView::GetInstance()->ChangeView(BLOODRESULT, BLOODCHECKVIEW);
+            BloodOxygenModel::GetInstance()->SetCheckStatus(true); // 开始检测
+            return true;
+        }
+        // 从检测失败界面回到主界面
+        if (strcmp(view.GetViewId(), "StCheck") == 0)
+        {
+            BloodOxygenView::GetInstance()->ChangeView(BLOODRESULT, BLOODVIEW);
+            BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测
+            return true;
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::OnClick");
+        return false;
     }
 
     // 增加按键事件
     bool BloodOxygenPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
     {
-#if 0
+#if BLOODKEYABLE
         WEARABLE_LOGD("", "into the view is: %s\n", typeid(view).name());
         uint16 keyID = event.GetKeyId();
         WEARABLE_LOGD("", "into key! keyID %u\n", keyID);
@@ -161,42 +176,64 @@ namespace OHOS
     }
     void BloodOxygenPresenter::ProgressNotify(void)
     {
-        if (CheckPointersValue() == false)
+        // 当检测状态为开始检测,开始检测
+        if (BloodOxygenModel::GetInstance()->GetCheckStatus() == true)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::Pointers is empty");
-            return;
+            BloodCheckView::GetInstance()->UpSpo2Text(); // 更新
+            if (startspo2 == true)
+            {
+                uint8_t md = PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST;
+                send_ppg_cmd_msg(md);
+                startspo2 = false;
+            }
         }
-        if (BloodOxygenModel::GetInstance()->GetBloodOxygenViewStatus() == true)
+
+        // 当检测状态为结束检测,结束检测
+        if (BloodOxygenModel::GetInstance()->GetCheckStatus() == false)
         {
-            count--;
-            BloodOxygenView::GetInstance()->GetCircleProgress()->SetValue(count);
-            if (count == PROGRESS_VALUE_MIN)
+            BloodOxygenView::GetInstance()->Upspo2data(); // 更新主界面
+            if (startspo2 == false)
             {
-                BloodOxygenView::GetInstance()->GetPercent()->SetText("98%");
-                BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(false);
-                count = PROGRESS_VALUE_MAX;
-                BloodOxygenView::GetInstance()->GetCircleProgress()->SetValue(count);
-                BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(true);
+                uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST;
+                send_ppg_cmd_msg(md);
+                startspo2 = true;
             }
         }
     }
 
     void BloodOxygenPresenter::ReturnInterface()
     {
+        // 佩戴动画播放完毕,前往检测界面
         if (BloodOxygenModel::GetInstance()->GetBloodBandoffViewStatus() == true)
         {
             if (BloodBandoffView::GetInstance()->GetImageAnimator()->GetState() == false)
             {
+                BloodOxygenView::GetInstance()->ChangeView(BLOODBANDVIEW, BLOODCHECKVIEW);
                 BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(false);
-                BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(true);
-
-                BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(false);
-                BloodOxygenView::GetInstance()->GetBloodOxygenGroup()->SetVisible(true);
-#ifdef SUPPORT_SPO2_NOTIFICATION
-                uint32_t md = PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST;
-                send_ppg_cmd_msg(md);
-#endif
-                display_api->set_screen_auto_off_timeout(display_time); // 复原
+                // 设置检测界面状态
+                BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(true);
+                // 播放检测界面动画
+                BloodCheckView::GetInstance()->GetImageAnimator()->Start();
+                BloodOxygenModel::GetInstance()->SetCheckStatus(true); // 开始检测
+            }
+        }
+        // 检测动画播放完毕
+        if (BloodOxygenModel::GetInstance()->GetBloodCheckViewStatus() == true)
+        {
+            if (BloodCheckView::GetInstance()->GetImageAnimator()->GetState() == false)
+            {
+                // 测试失败
+                if (BloodOxygenModel::GetInstance()->GetSPO2data() == 0)
+                {
+                    BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODRESULT);
+                }
+                // 测试成功
+                else
+                {
+                    BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODVIEW);
+                }
+                BloodOxygenModel::GetInstance()->SetCheckStatus(false); // 关闭检测
+                BloodOxygenModel::GetInstance()->SetBloodCheckViewStatus(false);
             }
         }
     }
index a8eb34a..1e47053 100644 (file)
 
 #include "BloodOxygenView.h"
 #include "BloodOxygenModel.h"
-
+#include "BloodOxygenPresenter.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "power_display_service.h"
 namespace OHOS
 {
     // 按钮设置
-    static constexpr uint16_t TESTBUTTON_ZERO = 0;
-    static constexpr uint16_t TESTBUTTON_X = 167;
-    static constexpr uint16_t TESTBUTTON_Y = 360;
-
-    // 进度条参数设置
-    static constexpr uint16_t CIRCLE_PROGRESS_VALUE = 100;
-    static constexpr uint16_t CIRCLE_PROGRESS_RADIUS = 43;
-    static constexpr uint16_t CIRCLE_PROGRESS_STARTANGLE = 360;
-    static constexpr uint16_t CIRCLE_PROGRESS_ENDANGLE = 0;
-    static constexpr uint16_t CIRCLE_PROGRESS_WIDTH = 10;
-    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_X = 10;
-    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_Y = 10;
-    static constexpr uint16_t CIRCLE_PROGRESS_CENTER_X = 195;
-    static constexpr uint16_t CIRCLE_PROGRESS_CENTER_Y = 37;
-    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_WIDTH = 275;
-    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_HEIGHT = 130;
-    static constexpr uint16_t CIRCLE_PROGRESS_LEFT = 10;
-    static constexpr uint16_t CIRCLE_PROGRESS_TOP = 5;
-
-    // 动态刷新设置
-    static constexpr uint16_t IMAGE_SIZE = 60;
-    static constexpr uint16_t IMAGE_POSITION_X = 186;
-    static constexpr uint16_t IMAGE_POSITION_Y = 23;
-    static constexpr uint16_t IMAGEANIMATORVIEW_SIZE = 31;
-    static constexpr uint16_t IMAGEANIMATORVIEW_SPEED = 40;
-
-    // 血氧主图设置
-    static constexpr uint16_t IMAGE_PROGRESS_POSITION_X = 176;
-    static constexpr uint16_t IMAGE_PROGRESS_POSITION_Y = 13;
-
-    // 血氧%显示
-    static constexpr uint16_t LABEL_PERCENT_POSITION_X = 258;
-    static constexpr uint16_t LABEL_PERCENT_POSITION_Y = 40;
-
-    // 血氧柱状图
-    static constexpr int16 VIEW_MAX_X = 415;
-    static constexpr int16 VIEW_MIN_X = 35;
-    static constexpr int16 VIEW_MAX_Y = 150;
-    static constexpr int16 VIEW_MIN_Y = 0;
-    static constexpr int16 VIEW_WIDTH = 7;
-    static constexpr int16 VIEW_HEIGHT = 300;
-    static constexpr uint16_t VIEW_BACKGROUND_OPA = 127;
-    static constexpr uint16_t VIEW_BORDER_RADIUS = 5;
-    static constexpr uint16_t BORDER_OPA = 127;
-    static constexpr uint16_t BORDER_WIDTH = 20;
-
-    static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;
-    static constexpr uint16_t FONT_DEFAULT_SIZE = 20;
-    static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;
-    static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;
-    static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;
-    static constexpr uint16_t BUTTON_LABEL_SIZE = 40;
-    static constexpr uint8_t BUTTON_STYLE_BORDER_RADIUS_VALUE = 20;
-    static constexpr uint32 BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFFFFFF;
-    static constexpr uint16_t BUTTON_WIDHT2 = 120;
-    static constexpr uint16_t BUTTON_HEIGHT2 = 60;
-
-    // 字体大小
-    static constexpr uint16_t PERCENT_FONT_SIZE = 25;
+    static constexpr uint16_t BUTTON_LABEL_SIZE = 30;
+    static constexpr uint16_t TESTBUTTON_X = 118;
+    static constexpr uint16_t TESTBUTTON_Y = 336;
+    static constexpr uint16_t BUTTON_WIDHT2 = 230;
+    static constexpr uint16_t BUTTON_HEIGHT2 = 80;
+
+    // 标签设置
+    static constexpr uint16_t PERCENT_X = 133;
+    static constexpr uint16_t PERCENT_Y = 103;
+    static constexpr uint16_t PERCENT_FONT_SIZE = 140;
+    static constexpr uint16_t TIMELABEL_X = 141;
+    static constexpr uint16_t TIMELABEL_Y = 270;
+    static constexpr uint16_t TIMELABEL_FONT_SIZE = 30;
+    static constexpr uint16_t TITLE_X = 161;
+    static constexpr uint16_t TITLE_Y = 55;
+    static constexpr uint16_t TITLE_FONT_SIZE = 28;
 
     static constexpr uint16_t MATH_ZERO = 0;
-
     static BloodOxygenView *g_pMainView = nullptr;
-    static ImageAnimatorInfo g_imageAnimatorInfo_new[31] = {
-        {PNG_BLOOD_FLOW_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_24, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_25, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_26, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_27, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_28, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_29, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_BLOOD_FLOW_IMAGE_30, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-    };
 
     BloodOxygenView::BloodOxygenView()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::BloodOxygenView");
-        imageViewMain = nullptr;
-        imageViewProgress = nullptr;
-        group = nullptr;
-        percent = nullptr;
-        testButton = nullptr;
-        circleProgress = nullptr;
-        imageAnimator = nullptr;
         g_pMainView = this;
-        bloodbandoff = new BloodBandoffView();
-        if (bloodbandoff == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new BloodBandoffView fail");
-        }
     }
 
     BloodOxygenView::~BloodOxygenView()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::~BloodOxygenView");
-        group->RemoveAll();
+        BloodScrollView[BLOODVIEW]->RemoveAll();
+        UIView::OnDragListener *draglistener = BloodScrollView[BLOODVIEW]->GetOnDragListener();
+        if (draglistener != nullptr)
+        {
+            delete draglistener;
+            draglistener = nullptr;
+        }
         delete imageViewMain;
-        delete imageViewProgress;
-        delete group;
+        delete timeLabel;
+        delete titleLabel;
         delete testButton;
         delete percent;
-        delete circleProgress;
-        delete imageAnimator;
         delete bloodbandoff;
+        delete bloodcheck;
+
         imageViewMain = nullptr;
-        imageViewProgress = nullptr;
-        group = nullptr;
+        titleLabel = nullptr;
+        timeLabel = nullptr;
         percent = nullptr;
         testButton = nullptr;
-        circleProgress = nullptr;
-        imageAnimator = nullptr;
         g_pMainView = nullptr;
         bloodbandoff = nullptr;
+        bloodcheck = nullptr;
+        delete BloodScrollView[BLOODVIEW];
+        BloodScrollView[BLOODVIEW] = nullptr;
     }
-
     BloodOxygenView *BloodOxygenView::GetInstance(void)
     {
         return g_pMainView;
     }
-
-    UILabel *BloodOxygenView::GetPercent()
-    {
-        return percent;
-    }
-
-    UIViewGroup *BloodOxygenView::GetBloodOxygenGroup()
+    void BloodOxygenView::Upspo2data()
     {
-        return group;
+        uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
+        //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_);
+        std::string bloodoxygenStr = std::to_string(spo2_);
+        percent->SetText(bloodoxygenStr.c_str());
     }
 
-    UILabelButton *BloodOxygenView::GetTestButton()
+    // 初始化标签
+    bool BloodOxygenView::InitLabel()
     {
-        return testButton;
-    }
-
-    UICircleProgress *BloodOxygenView::GetCircleProgress()
-    {
-        return circleProgress;
+        /* -------------------------------------------------------------------------- */
+        percent = new UILabel();
+        if (percent == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new percent fail");
+            return false;
+        }
+        percent->SetPosition(PERCENT_X, PERCENT_Y); // widget's left position and top position
+        percent->Resize(200, 200);                  // widget's width and height
+        percent->SetViewId("label2");               // Set style
+        percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE);
+        spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", spo2_);
+        std::string bloodoxygenStr = std::to_string(spo2_);
+        percent->SetText(bloodoxygenStr.c_str());
+        percent->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        percent->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        percent->SetRollSpeed(0);
+        percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);
+        /* -------------------------------------------------------------------------- */
+        timeLabel = new UILabel();
+        if (timeLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new timeLabel fail");
+            return false;
+        }
+        timeLabel->SetPosition(TIMELABEL_X, TIMELABEL_Y); // widget's left position and top position
+        timeLabel->Resize(185, 35);                       // widget's width and height
+        timeLabel->SetViewId("label1");                   // Set style
+        timeLabel->SetStyle(STYLE_TEXT_FONT, TIMELABEL_FONT_SIZE);
+        timeLabel->SetText("20分钟前检测");
+        timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        timeLabel->SetRollSpeed(0);
+        timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMELABEL_FONT_SIZE);
+        /* -------------------------------------------------------------------------- */
+        titleLabel = new UILabel();
+        if (titleLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new titleLabel fail");
+            return false;
+        }
+        titleLabel->SetPosition(TITLE_X, TITLE_Y); // widget's left position and top position
+        titleLabel->Resize(200, 90);               // widget's width and height
+        titleLabel->SetViewId("label3");           // Set style
+        titleLabel->SetStyle(STYLE_TEXT_FONT, TITLE_FONT_SIZE);
+        titleLabel->SetText("血氧饱和度");
+        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        titleLabel->SetRollSpeed(0);
+        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);
+        /* -------------------------------------------------------------------------- */
+        return true;
     }
-
+    // 创建标签按键
     UILabelButton *BloodOxygenView::CreateAndSetUIButton(const char *title)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIButton");
@@ -184,16 +148,13 @@ namespace OHOS
             return nullptr;
         }
         btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2);
+        btn->SetStyle(STYLE_BACKGROUND_COLOR, 0xffcd492c);
         btn->SetText(title);
-        btn->SetTextColor(Color::Red());
+        // btn->SetTextColor(Color::Red());
         btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE);
+        btn->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
         btn->SetAlign(TEXT_ALIGNMENT_CENTER);
-        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::RELEASED);
-        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::PRESSED);
-        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::INACTIVE);
-        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);
-        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);
-        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);
+        btn->SetViewId("checkbegin");
         UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::BloodOxygenPresenter::GetInstance();
         if (clickLeftListener == nullptr)
         {
@@ -203,193 +164,226 @@ namespace OHOS
         btn->SetOnClickListener(clickLeftListener);
         return btn;
     }
-
-    bool BloodOxygenView::SetOnDragListener()
+    // 初始化背景
+    bool BloodOxygenView::InitImageDisplay()
     {
-        UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::BloodOxygenPresenter::GetInstance();
-        if (dragListener == nullptr)
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitImageDisplay");
+        imageViewMain = new UIImageView();
+        if (imageViewMain == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnDragListener fail");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");
             return false;
         }
-        group->SetDraggable(true);
-        group->SetTouchable(true);
-        group->SetOnDragListener(dragListener);
+        imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 :  offset
+        char *image1imagesPath = "/user/res/Blood/beijing.bin";
+        imageViewMain->SetSrc(image1imagesPath);
         return true;
     }
-
-    UIView *BloodOxygenView::CreateAndSetUIView(int16 x, int16 y) const
+    // 初始化界面
+    bool BloodOxygenView::InitBloodView()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIView");
-        UIView *view = new UIView();
-        if (view == nullptr)
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitBloodView");
+        BloodScrollView[BLOODVIEW] = new UIScrollView();
+        if (BloodScrollView[BLOODVIEW] == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new View fail");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::BloodScrollView new fail!");
+            return false;
         }
-        if (x > VIEW_MAX_X || x < VIEW_MIN_X)
+        BloodScrollView[BLOODVIEW]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        BloodScrollView[BLOODVIEW]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        BloodScrollView[BLOODVIEW]->SetScrollBlankSize(35);
+        BloodScrollView[BLOODVIEW]->SetReboundSize(50);
+        BloodScrollView[BLOODVIEW]->SetDirection(1);
+        // 增加拖拽监听
+        UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new BloodOxygenPresenter());
+        if (draglistener == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::X error");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::draglistener can not be nullptr!");
+            return false;
         }
-        if (y < VIEW_MIN_Y || y > VIEW_MAX_Y)
+        BloodScrollView[BLOODVIEW]->SetOnDragListener(draglistener);
+        BloodScrollView[BLOODVIEW]->SetTouchable(true);
+        BloodScrollView[BLOODVIEW]->SetDraggable(true);
+        /* -------------------------------------------------------------------------- */
+        if (InitImageDisplay() == false)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::Y error");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitImageDisplay() fail!");
+            return false;
         }
-        view->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
-        view->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BACKGROUND_OPA); // 127 : background opacity
-        view->SetStyle(STYLE_BORDER_RADIUS, VIEW_BORDER_RADIUS);   // 5 : radius value
-        view->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);
-        view->SetStyle(STYLE_BORDER_OPA, BORDER_OPA);     // 127 : border opacity
-        view->SetStyle(STYLE_BORDER_WIDTH, BORDER_WIDTH); // 20 : border width
-        view->SetStyle(STYLE_PADDING_LEFT, MATH_ZERO);
-        view->SetStyle(STYLE_PADDING_RIGHT, MATH_ZERO);
-        view->SetStyle(STYLE_PADDING_TOP, MATH_ZERO);
-        view->SetStyle(STYLE_PADDING_BOTTOM, MATH_ZERO);
-        view->SetStyle(STYLE_MARGIN_LEFT, MATH_ZERO);
-        view->SetStyle(STYLE_MARGIN_RIGHT, MATH_ZERO);
-        view->SetStyle(STYLE_MARGIN_TOP, MATH_ZERO);
-        view->SetStyle(STYLE_MARGIN_BOTTOM, MATH_ZERO);
-
-        view->SetPosition(x, VIEW_HEIGHT - y);
-        view->SetStyle(STYLE_BORDER_WIDTH, MATH_ZERO);
-        view->SetStyle(STYLE_BORDER_RADIUS, MATH_ZERO); // 2 : half width 10 : offset
-        view->Resize(VIEW_WIDTH, y);
-        return view;
-    }
-
-    UICircleProgress *BloodOxygenView::CreateAndSetUICircleProgress()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUICircleProgress");
-        UICircleProgress *circle = new UICircleProgress();
-        circle->SetPosition(CIRCLE_PROGRESS_POSITION_X, CIRCLE_PROGRESS_POSITION_Y,
-                            CIRCLE_PROGRESS_POSITION_WIDTH, CIRCLE_PROGRESS_POSITION_HEIGHT);
-        circle->SetCenterPosition(CIRCLE_PROGRESS_CENTER_X, CIRCLE_PROGRESS_CENTER_Y);
-        circle->SetRadius(CIRCLE_PROGRESS_RADIUS);
-        circle->SetValue(CIRCLE_PROGRESS_VALUE);
-        circle->SetBackgroundStyle(STYLE_LINE_WIDTH,
-                                   circle->GetBackgroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);
-        circle->SetForegroundStyle(STYLE_LINE_WIDTH,
-                                   circle->GetForegroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);
-        circle->SetStyle(STYLE_PADDING_LEFT, CIRCLE_PROGRESS_LEFT);
-        circle->SetStyle(STYLE_PADDING_TOP, CIRCLE_PROGRESS_TOP);
-        circle->SetStartAngle(CIRCLE_PROGRESS_STARTANGLE);
-        circle->SetEndAngle(CIRCLE_PROGRESS_ENDANGLE);
-        circle->SetImage(nullptr, PNG_PROGRESS_BAR_TMAGE);
-        circle->SetLineColor(Color::Black());
-
-        return circle;
-    }
-
-    bool BloodOxygenView::InitImageDisplay()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitImageDisplay");
-        imageViewMain = new UIImageView();
-        if (imageViewMain == nullptr)
+        if (InitLabel() == false)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitLabel() fail!");
             return false;
         }
-        imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 :  offset
-        imageViewMain->SetSrc(PNG_BLOODOXYGEN_IMAGE_PATH);
-        group->Add(imageViewMain);
-
-        imageAnimator = new UIImageAnimatorView();
-        if (imageAnimator == nullptr)
+        testButton = CreateAndSetUIButton("检测");
+        if (testButton == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageAnimatorView fail");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Button fail");
             return false;
         }
-        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_new, IMAGEANIMATORVIEW_SIZE, IMAGEANIMATORVIEW_SPEED);
-        imageAnimator->Start();
-        imageAnimator->SetRepeat(true);
-        group->Add(imageAnimator);
+        /* -------------------------------------------------------------------------- */
+        return true;
+    }
 
-        imageViewProgress = new UIImageView();
-        if (imageViewProgress == nullptr)
+    // 1.跳转到血氧界面
+    bool BloodOxygenView::ChangeBloodView(int16_t thisView)
+    {
+        if (BloodScrollView[thisView] == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::ChangeBloodView");
+            RootView::GetInstance()->Add(BloodScrollView[thisView]);
         }
-        imageViewProgress->SetPosition(IMAGE_PROGRESS_POSITION_X, IMAGE_PROGRESS_POSITION_Y); // 30 :  offset
-        imageViewProgress->SetSrc(PNG_PROGRESS_BAR_TMAGE);
-        group->Add(imageViewProgress);
-
         return true;
     }
-
-    void BloodOxygenView::OnStart()
+    // 2.跳转到佩戴界面
+    bool BloodOxygenView::ChangeBandoffView(int16_t thisView)
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnStart");
-        View<BloodOxygenPresenter>::OnStart();
-
-        group = new UIViewGroup();
-        if (group == nullptr)
+        if (BloodScrollView[thisView] == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new group fail");
-            return;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::ChangeBandoffView");
+            bloodbandoff = new BloodBandoffView();
+            if (bloodbandoff == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            BloodScrollView[thisView] = bloodbandoff->BloodBondoffViewInit();
+            RootView::GetInstance()->Add(BloodScrollView[thisView]);
         }
-        group->SetPosition(MATH_ZERO, MATH_ZERO);
-        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
-
-        if (InitImageDisplay() == false)
+        return true;
+    }
+    // 3.跳转到检测界面
+    bool BloodOxygenView::ChangeCheckView(int16_t thisView)
+    {
+        if (BloodScrollView[thisView] == nullptr)
         {
-            return;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::ChangeCheckView");
+            bloodcheck = new BloodCheckView();
+            if (bloodcheck == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            BloodScrollView[thisView] = bloodcheck->BloodCheckViewInit();
+            RootView::GetInstance()->Add(BloodScrollView[thisView]);
         }
-
-        if (SetOnDragListener() == false)
+        return true;
+    }
+    // 4.跳转到检测失败界面
+    bool BloodOxygenView::ChangeResultView(int16_t thisView)
+    {
+        if (BloodScrollView[thisView] == nullptr)
         {
-            return;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::BloodResultView");
+            bloodresult = new BloodResultView();
+            if (bloodresult == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView:: new scrollView[%d] fail", thisView);
+                return false;
+            }
+            BloodScrollView[thisView] = bloodresult->BloodResultViewInit();
+            RootView::GetInstance()->Add(BloodScrollView[thisView]);
         }
-
-        circleProgress = CreateAndSetUICircleProgress();
-        if (circleProgress == nullptr)
+        return true;
+    }
+    UIScrollView *BloodOxygenView::GetBloodScrollView(int ViewId)
+    {
+        if (BloodScrollView[ViewId] == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new circleProgress fail");
-            return;
+            return nullptr;
         }
-        group->Add(circleProgress);
+        return BloodScrollView[ViewId];
+    }
+    /* -------------------------------------------------------------------------- */
+    // 1.MainStopWatchViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。
+    struct BloodViewMapper
+    {
+        const int16_t viewId;
+        bool (BloodOxygenView::*func)(int16_t thisView);
+    };
 
-        percent = new UILabel();
-        if (percent == nullptr)
+    // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。
+    static const BloodViewMapper ViewMapper[] = {
+        {BLOODVIEW, &BloodOxygenView::ChangeBloodView},
+        {BLOODBANDVIEW, &BloodOxygenView::ChangeBandoffView},
+        {BLOODCHECKVIEW, &BloodOxygenView::ChangeCheckView},
+        {BLOODRESULT, &BloodOxygenView::ChangeResultView},
+    };
+
+    // 3.根据传入的interface参数执行相应视图ID关联的成员函数。
+    bool BloodOxygenView::ClickFunc(int16_t interface)
+    {
+        int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[BLOODVIEW]);
+        for (int i = 0; i < funcSize; i++)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Label fail");
-            return;
+            if (interface == ViewMapper[i].viewId)
+            {
+                bool jug = (this->*(ViewMapper[i].func))(interface);
+                if (jug == false)
+                {
+                    return false;
+                }
+                return true;
+            }
         }
-        percent->SetPosition(LABEL_PERCENT_POSITION_X, LABEL_PERCENT_POSITION_Y,
-                             VIEW_DISTANCE_TO_LEFT_SIDE, TITLE_LABEL_DEFAULT_HEIGHT);
-        percent->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
-        percent->SetText("%97");
-        percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);
-        percent->SetTextColor(Color::Red());
-        group->Add(percent);
+        return false;
+    }
 
-        testButton = CreateAndSetUIButton("测试");
-        if (testButton == nullptr)
+    // 4.切换视图
+    void BloodOxygenView::ChangeView(int16_t hideView, int16_t showView)
+    {
+        if (hideView > MAX_BLOODVIEW)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Button fail");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView:: BloodViewId Overstep ones bounds");
             return;
         }
-        group->Add(testButton);
-
-        if (OHOS::BloodOxygenModel::GetInstance()->GetBloodOxygenViewStatus() == true)
+        BloodScrollView[hideView]->SetVisible(false);
+        ClickFunc(showView);
+        BloodScrollView[showView]->SetVisible(true);
+        Draw();
+    }
+    /* -------------------------------------------------------------------------- */
+    bool BloodOxygenView::SetOnDragListener()
+    {
+        UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (dragListener == nullptr)
         {
-            testButton->SetTouchable(false);
-            percent->SetText("");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnDragListener fail");
+            return false;
         }
+        group->SetDraggable(true);
+        group->SetTouchable(true);
+        group->SetOnDragListener(dragListener);
+        return true;
+    }
 
-        BloodBandoffView::GetInstance()->CreateUIViewGroup();
-
-        RootView::GetInstance()->Add(group);
-        RootView::GetInstance()->Add(BloodBandoffView::GetInstance()->GetBandoffViewGroup());
-        BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(false);
+    void BloodOxygenView::OnStart()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnStart");
+        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
+        display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
+        View<BloodOxygenPresenter>::OnStart();
+        if (!InitBloodView())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitBloodView fail");
+        }
     }
 
     void BloodOxygenView::OnSetUpView()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnSetUpView");
         View<BloodOxygenPresenter>::OnSetUpView();
+        if (BloodScrollView[BLOODVIEW] == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BLOODVIEW:: OnSetUpView  has nullptr");
+            return;
+        }
+        BloodScrollView[BLOODVIEW]->Add(imageViewMain);
+        BloodScrollView[BLOODVIEW]->Add(percent);
+        BloodScrollView[BLOODVIEW]->Add(timeLabel);
+        BloodScrollView[BLOODVIEW]->Add(titleLabel);
+        BloodScrollView[BLOODVIEW]->Add(testButton);
+        RootView::GetInstance()->Add(BloodScrollView[BLOODVIEW]);
         Draw();
     }
 
@@ -402,6 +396,7 @@ namespace OHOS
 
     void BloodOxygenView::OnStop()
     {
+        display_api->set_screen_auto_off_timeout(display_time); // 恢复
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnStop");
         View<BloodOxygenPresenter>::OnStop();
         RootView::GetInstance()->RemoveAll();
diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp
new file mode 100644 (file)
index 0000000..2d107a6
--- /dev/null
@@ -0,0 +1,248 @@
+
+
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "BloodResultView.h"
+#include "BloodOxygenModel.h"
+#include "ui_image_animator.h"
+#include "BloodResultView.h"
+namespace OHOS
+{
+    // 图片设置
+    static constexpr uint16_t IMAGE_SIZE = 80;
+    static constexpr uint16_t IMAGE_X = 193;
+    static constexpr uint16_t IMAGE_Y = 111;
+
+    // 按钮设置
+    static constexpr uint16_t BUTTON_LABEL_SIZE = 26;
+    static constexpr uint16_t BUTTON_WIDHT = 230;
+    static constexpr uint16_t BUTTON_HEIGHT = 80;
+    static constexpr uint16_t ST_BUTTON_X = 118;
+    static constexpr uint16_t ST_BUTTON_Y = 334;
+    static constexpr uint16_t RE_BUTTON_X = 118;
+    static constexpr uint16_t RE_BUTTON_Y = 434;
+
+    // 标签设置
+    static constexpr uint16_t LABLE_FONT_SIZE = 30;
+    static constexpr uint16_t TITLE_POSITION_X = 149;
+    static constexpr uint16_t TITLE_POSITION_Y = 52;
+    static constexpr uint16_t label1_POSITION_X = 58;
+    static constexpr uint16_t label1_POSITION_Y = 208;
+    static constexpr uint16_t label2_POSITION_X = 38;
+    static constexpr uint16_t label2_POSITION_Y = 243;
+    static constexpr uint16_t LABEL3_POSITION_X = 143;
+    static constexpr uint16_t LABEL3_POSITION_Y = 278;
+
+    static BloodResultView *g_pMainView = nullptr;
+    BloodResultView::BloodResultView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
+        
+        g_pMainView = this;
+    }
+
+    BloodResultView *BloodResultView::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    BloodResultView::~BloodResultView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultView::~BloodResultView");
+        BloodResultScrollView->RemoveAll();
+        delete imageerror;
+        delete titlelabel;
+        delete label1;
+        delete label2;
+        delete label3;
+        delete ReButton;
+        delete StButton;
+        delete BloodResultScrollView;
+
+        titlelabel = nullptr;
+        label1 = nullptr;
+        label2 = nullptr;
+        label3 = nullptr;
+        BloodResultScrollView = nullptr;
+        ReButton = nullptr;
+        StButton = nullptr;
+        g_pMainView = this;
+    }
+    // 初始化标签
+    bool BloodResultView::InitLabel()
+    {
+        titlelabel = new UILabel();
+        if (titlelabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
+            return false;
+        }
+        titlelabel->SetPosition(149, 52); // widget's left position and top position
+        titlelabel->Resize(200, 60);      // widget's width and height
+        titlelabel->SetViewId("label1");  // Set style
+        titlelabel->SetStyle(STYLE_TEXT_FONT, 28);
+
+        // Set additional property
+        titlelabel->SetText("检测不到结果");
+        titlelabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        titlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        titlelabel->SetRollSpeed(0);
+        titlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
+        /* -------------------------------------------------------------------------- */
+        label1 = new UILabel();
+        if (label1 == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
+            return false;
+        }
+        label1->SetPosition(53, 208); // widget's left position and top position
+        label1->Resize(200, 60);      // widget's width and height
+        label1->SetViewId("label4");  // Set style
+        label1->SetStyle(STYLE_TEXT_FONT, 30);
+
+        label1->SetText("请确认已带上手表,并保持");
+        label1->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        label1->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        label1->SetRollSpeed(0);
+        label1->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        /* -------------------------------------------------------------------------- */
+        label2 = new UILabel();
+        if (label2 == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
+            return false;
+        }
+        label2->SetPosition(38, 243); // widget's left position and top position
+        label2->Resize(200, 60);      // widget's width and height
+        label2->SetViewId("label5");  // Set style
+        label2->SetStyle(STYLE_TEXT_FONT, 30);
+        label2->SetText("静止,准备好后点击下方按钮");
+        label2->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        label2->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        label2->SetRollSpeed(0);
+        label2->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+
+        /* -------------------------------------------------------------------------- */
+        label3 = new UILabel();
+        if (label3 == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
+            return false;
+        }
+        label3->SetPosition(143, 278); // widget's left position and top position
+        label3->Resize(200, 60);       // widget's width and height
+        label3->SetViewId("label6");   // Set style
+        label3->SetStyle(STYLE_TEXT_FONT, 30);
+        label3->SetText("进行重新检测");
+        label3->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        label3->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        label3->SetRollSpeed(0);
+        label3->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+
+        return true;
+    }
+    // 初始化图片
+    bool BloodResultView::InitImageDisplay()
+    {
+        imageerror = new UIImageView();
+        if (imageerror == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImageDisplay fail");
+            return false;
+        }
+        imageerror->SetPosition(193, 111); // widget's left position and top position
+        imageerror->Resize(100, 100);      // widget's width and height
+        imageerror->SetViewId("image1");   // Set style
+        char *image1imagesPath = "/user/res/Blood/Error.bin";
+        imageerror->SetSrc(image1imagesPath);
+        return true;
+    }
+    UIScrollView *BloodResultView::BloodResultViewInit()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodResultView::CreateUIViewBloodResultScrollView");
+        BloodResultScrollView = new UIScrollView();
+        if (BloodResultScrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new BloodResultScrollView fail");
+            return nullptr;
+        }
+        BloodResultScrollView->SetPosition(0, 0);
+        BloodResultScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+        BloodResultScrollView->SetScrollBlankSize(35);
+        BloodResultScrollView->SetReboundSize(50);
+        BloodResultScrollView->SetDirection(1);
+        // 增加拖拽监听
+        UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new BloodOxygenPresenter());
+        if (draglistener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodView::draglistener can not be nullptr!");
+            return nullptr;
+        }
+        BloodResultScrollView->SetOnDragListener(draglistener);
+        BloodResultScrollView->SetTouchable(true);
+        BloodResultScrollView->SetDraggable(true);
+        /* -------------------------------------------------------------------------- */
+        if (InitImageDisplay() == false)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "nitImageDisplay fail");
+            return nullptr;
+        }
+        if (InitLabel() == false)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
+            return nullptr;
+        }
+        /* -------------------------------------------------------------------------- */
+        ReButton = new UILabelButton();
+        if (ReButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButton fail");
+            return nullptr;
+        }
+        ReButton->SetPosition(118, 334);
+        ReButton->Resize(230, 80);
+        ReButton->SetText("重新检测");
+        ReButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF8A36);
+        ReButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        ReButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+        ReButton->SetViewId("ReCheck");
+        UIView::OnClickListener *clickLeft1Listener = (UIView::OnClickListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (clickLeft1Listener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new clickLeft1Listener fail");
+            return nullptr;
+        }
+        ReButton->SetOnClickListener(clickLeft1Listener);
+        /* -------------------------------------------------------------------------- */
+        StButton = new UILabelButton();
+        if (StButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButton fail");
+            return nullptr;
+        }
+        StButton->SetPosition(118, 434); // widget's left position and top position
+        StButton->Resize(230, 80);       // widget's width and height
+        StButton->SetText("停止检测");
+        StButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        StButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        StButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+        StButton->SetViewId("StCheck");
+        UIView::OnClickListener *clickLeft2Listener = (UIView::OnClickListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (clickLeft2Listener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new clickLeft2Listener fail");
+            return nullptr;
+        }
+        StButton->SetOnClickListener(clickLeft2Listener);
+        /* -------------------------------------------------------------------------- */
+        BloodResultScrollView->Add(imageerror);
+        BloodResultScrollView->Add(titlelabel);
+        BloodResultScrollView->Add(label1);
+        BloodResultScrollView->Add(label2);
+        BloodResultScrollView->Add(label3);
+        BloodResultScrollView->Add(ReButton);
+        BloodResultScrollView->Add(StButton);
+        /* -------------------------------------------------------------------------- */
+        return BloodResultScrollView;
+    }
+}
@@ -13,8 +13,6 @@
 #include "components/ui_label_button_ext.h"\r
 #include "components/ui_card_page.h"\r
 \r
-\r
-\r
 namespace OHOS\r
 {\r
 \r
@@ -51,6 +49,8 @@ namespace OHOS
         UILabel *bloodLabel = nullptr;\r
         UILabel *timeLabel = nullptr;\r
         bool viewiInitStatus{false};\r
+\r
+        int bloodoxygen;\r
     };\r
 } // namespace OHOS\r
 #endif // Blood_PRESENTER_H\r
@@ -1,5 +1,5 @@
 \r
-#include "blood/include/BloodCardView.h"\r
+#include "heart_blood/include/BloodCardView.h"\r
 \r
 #include "common/image_cache_manager.h"\r
 #include "UiConfig.h"\r
@@ -8,7 +8,8 @@
 #include "components/ui_button.h"\r
 #include "MainViewSample.h"\r
 #include "components/ui_view_group.h"\r
-\r
+#include "DialModelSPO2.h"\r
+#include "DialModelHeartRate.h"\r
 namespace OHOS\r
 {\r
     static BloodCardView *g_pBloodCardView{nullptr};\r
@@ -38,29 +39,22 @@ namespace OHOS
      */\r
     bool BloodCardView::AddButton()\r
     {\r
+#if 0\r
         // Add Button to App\r
         if (warnButton == nullptr)\r
         {\r
             warnButton = new UIButton();\r
         }\r
-        warnButton->SetPosition(300, 57); // widget's left position and top position\r
+        warnButton->SetPosition(300, 102); // widget's left position and top position\r
         warnButton->Resize(26, 26);       // widget's width and height\r
         warnButton->SetViewId(WARNING);   // Set style\r
         warnButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);\r
         warnButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
-\r
-        // Set additional property\r
         char *button1defaultImgSrc = "/user/res/Blood/Vector.bin";\r
         char *button1triggeredImgSrc = nullptr;\r
         warnButton->SetImageSrc(button1defaultImgSrc, button1triggeredImgSrc);\r
         warnButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
-\r
-        // Add the CallBack about events\r
-        // UIView::OnClickListener *button1Click = static_cast<UIView::OnClickListener *>(BloodPresenter::GetInstance());\r
-        // warnButton->SetOnClickListener(button1Click);\r
-        // Add to rootView\r
         Add(warnButton);\r
-\r
         // Add LabelButtonExt to App\r
         if (monitorButton == nullptr)\r
         {\r
@@ -70,15 +64,11 @@ namespace OHOS
         monitorButton->Resize(230, 80);       // widget's width and height\r
         monitorButton->SetViewId(CHECK);      // Set style\r
         monitorButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffcd492c);\r
-\r
-        // Set additional property\r
         monitorButton->SetText("检测");\r
         monitorButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 26);\r
         monitorButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);\r
-\r
-        // UIView::OnClickListener *labelButton1Click = static_cast<UIView::OnClickListener *>(BloodPresenter::GetInstance());\r
-        // monitorButton->SetOnClickListener(labelButton1Click);\r
         Add(monitorButton);\r
+#endif\r
         return true;\r
     }\r
     /***\r
@@ -92,18 +82,21 @@ namespace OHOS
         {\r
             bloodLabel = new UILabel();\r
         }\r
-        bloodLabel->SetPosition(157, 105); // widget's left position and top position\r
-        bloodLabel->Resize(200, 60);       // widget's width and height\r
-        bloodLabel->SetViewId("label2");   // Set style\r
-        bloodLabel->SetStyle(STYLE_TEXT_FONT, 140);\r
+        bloodLabel->SetPosition(83, 108); // widget's left position and top position\r
+        bloodLabel->Resize(300, 250);     // widget's width and height\r
+        bloodLabel->SetViewId("label2");  // Set style\r
+        bloodLabel->SetStyle(STYLE_TEXT_FONT, 150);\r
 \r
         // Set additional property\r
-        int bloodoxygen = 98;\r
-        bloodLabel->SetText(std::to_string(bloodoxygen).c_str());\r
-        bloodLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+        // bloodoxygen =DialModelHeartRate::GetInstance()->GetHeartData();\r
+        bloodoxygen = 97;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", bloodoxygen);\r
+        std::string bloodoxygenStr = std::to_string(bloodoxygen);\r
+        bloodLabel->SetText(bloodoxygenStr.c_str());\r
+        bloodLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
         bloodLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
         bloodLabel->SetRollSpeed(0);\r
-        bloodLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 140);\r
+        bloodLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 150);\r
 \r
         // Add to rootView\r
         Add(bloodLabel);\r
@@ -113,7 +106,7 @@ namespace OHOS
         {\r
             timeLabel = new UILabel();\r
         }\r
-        timeLabel->SetPosition(141, 263); // widget's left position and top position\r
+        timeLabel->SetPosition(140, 370); // widget's left position and top position\r
         timeLabel->Resize(185, 35);       // widget's width and height\r
         timeLabel->SetViewId("label1");   // Set style\r
         timeLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
@@ -133,17 +126,17 @@ namespace OHOS
         {\r
             titleLabel = new UILabel();\r
         }\r
-        titleLabel->SetPosition(143, 52); // widget's left position and top position\r
-        titleLabel->Resize(200, 60);      // widget's width and height\r
+        titleLabel->SetPosition(158, 70); // widget's left position and top position\r
+        titleLabel->Resize(200, 90);      // widget's width and height\r
         titleLabel->SetViewId("label3");  // Set style\r
-        titleLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
+        titleLabel->SetStyle(STYLE_TEXT_FONT, 28);\r
 \r
         // Set additional property\r
         titleLabel->SetText("血氧饱和度");\r
         titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
         titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
         titleLabel->SetRollSpeed(0);\r
-        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);\r
 \r
         // Add to rootView\r
         Add(titleLabel);\r
index 2e9173a..64d7b4e 100644 (file)
@@ -33,7 +33,7 @@
 #include "PullUpDownView.h"
 #include "components/ui_cross_view.h"
 
-#include "blood/include/BloodCardView.h"
+#include "heart_blood/include/BloodCardView.h"
 #include "traing/include/TraingView.h"
 #include "ApplistCardView.h"
 #include "weather/include/WeatherControlView.h"
index 9fd0909..989bde9 100644 (file)
 
 #include "DialBaseModel.h"
 
-namespace OHOS {
-class DialModelHeartRate : public DialBaseModel {
-public:
-    DialModelHeartRate() {}
-    virtual ~DialModelHeartRate() {}
-    static DialModelHeartRate* GetInstance()
+namespace OHOS
+{
+    class DialModelHeartRate : public DialBaseModel
     {
-        static DialModelHeartRate instance;
-        return &instance;
-    }
-    bool GetDialFloatData(DialDataType& type, float& out) override;
-    void UpdateHeartRate(int16_t heartRate);
+    public:
+        DialModelHeartRate() {}
+        virtual ~DialModelHeartRate() {}
+        static DialModelHeartRate *GetInstance()
+        {
+            static DialModelHeartRate instance;
+            return &instance;
+        }
+        bool GetDialFloatData(DialDataType &type, float &out) override;
+        void UpdateHeartRate(int16_t heartRate);
+        int GetHeartData(void);
 
-private:
-    float heartRate_ = 67.0; // 67.0: default heart value as reference
-};
+    private:
+        float heartRate_ = 67.0; // 67.0: default heart value as reference
+    };
 }
 #endif
index 0da9a52..da9662f 100644 (file)
@@ -24,6 +24,7 @@ namespace OHOS
         }
         bool GetDialFloatData(DialDataType &type, float &out) override;
         void UpdateSPO2(int16_t SPO2);
+        int GetSPO2Data();
 
     private:
         float SPO2_ = 97.0; // 97.0: default SPO2 value as reference
index c2af344..2e9878b 100644 (file)
@@ -7,17 +7,19 @@
 
 #ifndef ON_DIAL_DATA_UPDATE_LISTENER_H
 #define ON_DIAL_DATA_UPDATE_LISTENER_H
-
+#include <string>
 #include "DialDataBase.h"
 
-namespace OHOS {
-class OnDialDataUpdateListener : public HeapBase {
-public:
-    OnDialDataUpdateListener() {}
-    virtual ~OnDialDataUpdateListener() {}
-    virtual void OnDialFloatDataUpdate(DialDataType type, float data) {}
-    virtual void OnDialFloatDataUpdate(DialDataType type, const float* data, uint16_t num) {}
-    virtual void OnDialTextDataUpdate(DialDataType type, const std::string* data, uint16_t num) {}
-};
+namespace OHOS
+{
+    class OnDialDataUpdateListener : public HeapBase
+    {
+    public:
+        OnDialDataUpdateListener() {}
+        virtual ~OnDialDataUpdateListener() {}
+        virtual void OnDialFloatDataUpdate(DialDataType type, float data) {}
+        virtual void OnDialFloatDataUpdate(DialDataType type, const float *data, uint16_t num) {}
+        virtual void OnDialTextDataUpdate(DialDataType type, const std::string *data, uint16_t num) {}
+    };
 }
 #endif
index c738b4d..184cd2c 100644 (file)
@@ -29,4 +29,11 @@ namespace OHOS
             onChangeListener_->OnDialFloatDataUpdate(DialDataType::DATA_TYPE_HEART_RATE, heartRate_);
         }
     }
+
+    int DialModelHeartRate::GetHeartData()
+    {
+        // Assuming SPO2_ is a float member variable
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRate_ %f", heartRate_);
+        return static_cast<int>(heartRate_);
+    }
 }
index 0060916..1a0821b 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "RegisterDialModel.h"
 #include "DialModelSPO2.h"
+#include "wearable_log.h"
 
 REGIST_DIAL_MODULE(DialDataType::DATA_TYPE_SPO2, OHOS::DialModelSPO2::GetInstance());
 
@@ -27,4 +28,12 @@ namespace OHOS
             onChangeListener_->OnDialFloatDataUpdate(DialDataType::DATA_TYPE_SPO2, SPO2_);
         }
     }
+
+    int DialModelSPO2::GetSPO2Data()
+    {
+        // Assuming SPO2_ is a float member variable
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %f", SPO2_);
+        return static_cast<int>(SPO2_);
+    }
+
 }
index 3316e96..dbb6bfa 100644 (file)
@@ -29,6 +29,7 @@
 #include "DialBoxProgressView.h"\r
 #include "DialArcProgressView.h"\r
 #include "DialArcLabelView.h"\r
+#include "wearable_log.h"\r
 \r
 namespace OHOS {\r
 DialBinParser::DialBinParser()\r
@@ -114,7 +115,6 @@ int32_t DialBinParser::ParseDialHeader(FILE* file)
     dialGroup_->SetHeight(dialHeader->height);\r
     dialGroup_->SetPeriod(1000 / dialHeader->freq); // 1000: ms\r
     imageOffset_ = dialHeader->imageOffset;\r
-\r
     uint8_t* viewType = static_cast<uint8_t*>(MallocAndReadBuf(file, (sizeof(uint8_t) * dialHeader->dialViewCount)));\r
     if (viewType == nullptr) {\r
         UIFree(dialHeader);\r
@@ -131,7 +131,15 @@ int32_t DialBinParser::ParseDialHeader(FILE* file)
             }\r
         }\r
     }\r
-\r
+    /* -------------------------------------------------------------------------- */\r
+    #if 0\r
+        uint32_t resId = dialHeader->previewImgId | dirId_;\r
+        uint32_t curReadPt = ftell(file);\r
+        ImageInfo* info = ImageCacheManager::GetInstance().LoadOneInMultiRes(resId, file_, file, false, imageOffset_);\r
+        fseek(file, curReadPt, SEEK_SET);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "previewImgId %p %s", resId,info);\r
+    #endif\r
+    /* -------------------------------------------------------------------------- */\r
     UIFree(viewType);\r
     UIFree(dialHeader);\r
     return 0;\r
@@ -162,6 +170,7 @@ int32_t DialBinParser::ParserDialStaticImg(FILE* fp)
         return -1;\r
     }\r
     fseek(fp, curReadPt, SEEK_SET);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParserDialStaticImg %s %p", info,resId);\r
     view->SetSrc(info);\r
     dialGroup_->AddView(view);\r
 \r
index 2cd1305..7526df3 100644 (file)
@@ -55,6 +55,7 @@ private:
     std::string file_;\r
     uint32_t dirId_ = 0xfef << 20;\r
     uint32_t imageOffset_ = 0;\r
+    uint32_t pre_ = 0;\r
 };\r
 }\r
 #endif
\ No newline at end of file
index 315e034..16fc77f 100644 (file)
@@ -24,7 +24,7 @@ uint16_t ignore_slice_ids[] = {
     VIEW_UISAMPLE,
     VIEW_BLOODOXY,//血氧功能
 #ifdef SUPPORT_ALIPAY_SEC
-    // VIEW_MAIN_ALIPAY,
+    VIEW_MAIN_ALIPAY,
 #endif
 };
 
index 29fd711..f7a7eb6 100755 (executable)
@@ -12,6 +12,7 @@ set(PRIVATE_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/callerlog/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/phoneservice/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/main/include/dial
+    ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/bloodoxygen/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/main/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/player/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/bluetooth/include
@@ -103,6 +104,7 @@ set(PRIVATE_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/phoneservice/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/main/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/main/include/dial
+    ${CMAKE_CURRENT_SOURCE_DIR}/../../fd230app/nativeui/bloodoxygen/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/player/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativeui/bluetooth/include
     ${CMAKE_CURRENT_SOURCE_DIR}/../../nativeapp/nativelauncher/include
index e9b5b5a..9c66c61 100755 (executable)
@@ -19,6 +19,7 @@
 #include "DialModelCharge.h"
 #include "DialModelHeartRate.h"
 #include "DialModelSPO2.h"
+#include "BloodOxygenModel.h"
 #include "ppg_service.h"
 #include "CallerLogModel.h"
 #include "notification_manager.h"
@@ -220,6 +221,7 @@ void MsgCenterNotifySPO2hProc(const Topic topic, Request* req)
     {
         u_int8_t sp02 = *((u_int8_t*)(req->data)); // 进行类型转换
         DialModelSPO2::GetInstance()->UpdateSPO2(sp02);
+        BloodOxygenModel::GetInstance()->UpSPO2data(sp02);
     }
 }
 //穿戴状态
@@ -240,6 +242,7 @@ void MsgCenterNotifyHeartRateProc(const Topic topic, Request* req)
     if (topic == TOPIC_EVENT_HEARTRATE_UPDATA)
     {
         u_int8_t heart = *((u_int8_t*)(req->data)); // 进行类型转换
+        //通知对应信息进行更新
         DialModelHeartRate::GetInstance()->UpdateHeartRate(heart);
     }
 }
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_HEART.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_HEART.bin
new file mode 100644 (file)
index 0000000..5c0e448
Binary files /dev/null and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_HEART.bin differ