1.修改设置视图按键事件,现在可通过power键进行返回。
author罗正yun <1732036298@qq.com>
Sat, 20 Jan 2024 10:06:23 +0000 (18:06 +0800)
committer罗正yun <1732036298@qq.com>
Sat, 20 Jan 2024 10:06:23 +0000 (18:06 +0800)
2.但又出现新的问题:设置中的蓝牙也有按键事件,如果我进入蓝牙slice,通过按power键返回时按键事件触发了两次。
解决方法:1.标志位来跟踪按键事件的处理状态(测试了不行)
2.网上查阅资料说:可使用观察者模式来解决这个问题,

code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/settings/src/SettingPresenter.cpp
code/sdk/application/wearable/nativeapp/nativeui/weather/include/MainWeatherView.h
code/sdk/application/wearable/nativeapp/nativeui/weather/src/MainWeatherView.cpp

index 7cd3fc9..cd0ee58 100755 (executable)
@@ -222,17 +222,12 @@ bool BluetoothPresenter::OnClick(UIView &view, const ClickEvent &event)
        {
                uint16 keyID = event.GetKeyId();
         WEARABLE_LOGD("","into key! keyID %u\n",keyID);
-       #if 0
                //如果是power键就返回上一级
                if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER))
                {
                        uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-                       NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+                       NativeAbility::GetInstance().ChangeSlice(preSlice);
                }
-       #endif
-               //目前只有一个按键。直接切换
-               uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-               NativeAbility::GetInstance().ChangeSlice(preSlice);
                return true;
        }
 };
index df9d858..73d5ad2 100755 (executable)
@@ -16,11 +16,16 @@ namespace OHOS
     static SettingPresenter *g_pSettingPresenter = nullptr;
     SettingPresenter::SettingPresenter()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::SettingPresenter()");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::SettingPresenter");
         settingModel = &SettingModel::GetInstance();
+        g_pSettingPresenter = this;
     }
 
-    SettingPresenter::~SettingPresenter() {}
+    SettingPresenter::~SettingPresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::~SettingPresenter");
+        g_pSettingPresenter = nullptr;
+    }
 
     void SettingPresenter::OnStart()
     {
@@ -61,14 +66,14 @@ namespace OHOS
                GetPreSliceId作用:是从已存储的切片中获取上一个切片的ID,并且在切片数小于2的情况下返回一个无效的切片ID。
             */
             uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-            if(preSlice == VIEW_APPLIST){
+            if (preSlice == VIEW_APPLIST)
+            {
                 NativeAbility::GetInstance().ChangeSlice(preSlice);
             }
-            else 
+            else
             {
                 NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
             }
-
         }
         return false;
     }
@@ -77,13 +82,19 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SettingPresenter::OnKeyAct");
         uint16 keyID = event.GetKeyId();
-        printf("%d %s %d\n",keyID,__FUNCTION__,__LINE__);
-               //如果是power键就返回上一级
-               if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER))
-               {
-                       uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
-                       NativeAbility::GetInstance().ChangeSlice(preSlice);
-               }
+        // 如果是power键就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER))
+        {
+            uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+            if (preSlice == VIEW_APPLIST)
+            {
+                NativeAbility::GetInstance().ChangeSlice(preSlice);
+            }
+            else
+            {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+            }
+        }
         return true;
     }
 
@@ -100,8 +111,8 @@ namespace OHOS
         else
         {
             NativeAbility::GetInstance().ChangeSlice(SettingModel::GetInstance().GetSettingIdToViewId().at(index));
-            /* -------------------------------------------------------------------------- */
-            #if 0
+/* -------------------------------------------------------------------------- */
+#if 0
             if (index == SETTING_ITEM_TWO)
             {
                 RebootModel::GetInstance()->SetSelectViewId(REBOOTDEVICE);
@@ -113,7 +124,7 @@ namespace OHOS
                 RebootModel::GetInstance()->SetExitsView(true);
             }
             NativeAbility::GetInstance().ChangeSlice(SettingModel::GetInstance().GetSettingIdToViewId().at(index));
-            #endif
+#endif
             return true;
         }
     }
index 15b8016..b5554d4 100644 (file)
@@ -3,15 +3,7 @@
 \r
 #include "BaseView.h"\r
 #include "View.h"\r
-\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_scroll_view.h"\r
-#include "components/ui_label.h"\r
-#include "components/ui_image_view.h"\r
-#include "components/ui_image_animator.h"\r
 #include "weather/include/WeatherView.h"\r
-#include <iostream>\r
-\r
 \r
 namespace OHOS\r
 {\r
@@ -30,36 +22,7 @@ namespace OHOS
         void OnStop() override;\r
 \r
     private:\r
-        void InitView(void);\r
-        void DeInitView(void);\r
-        UILabel *InitLabel(int x, int y, const char *text, const char *id, int textfont, int lineheight);\r
-        void PreLoad(void);\r
-\r
-    private:\r
-        std::string GetTime();\r
-        std::string GetWeatherImage();\r
-        std::string GetWeatherTemperature();\r
-        std::string GetWeatherDescription();\r
-        std::string GetWeatherArea();\r
-        std::string GetWeatherMaxAndMinTemperature();\r
-\r
-        std::string Time;                 // 时间\r
-        std::string WeatherImag;          // 天气图片\r
-        std::string Temperature;          // 温度\r
-        std::string WeatherDescription;   // 天气描述\r
-        std::string WeatherArea;          // 天气地区\r
-        std::string MaxandMinTemperature; // 最高与最低气温\r
-    private:\r
-        UIViewGroup *container_ = nullptr;\r
-        UIScrollView *scrollView1_ = nullptr;\r
-        UILabel *label1_ = nullptr;\r
-        UILabel *label2_ = nullptr;\r
-        UIImageView *image1_ = nullptr;\r
-        UILabel *showWeatherDescriptionLabel = nullptr;\r
-        UILabel *label4_ = nullptr;\r
-        UILabel *label5_ = nullptr;\r
-        UIImageAnimatorView *imageAnimator1_ = nullptr;\r
-        bool viewInitStatus{false};\r
+    WeatherView * weatherView{nullptr};\r
     };\r
 } // namespace OHOS\r
 #endif
\ No newline at end of file
index f7890a8..8a7ceb3 100644 (file)
 #include "weather/include/MainWeatherView.h"\r
 #include "weather/include/MainWeatherPresenter.h"\r
-#include "UiConfig.h"\r
-/*\r
-当至天气界面时,主动获取最新天气数据。\r
-(此操作静默将进行,获取到则立刻更新显示,获取不到则重试\r
-重试3次无果结束更新)\r
-在加载该视图时,需要加载:1时间,2天气图片,3温度,4天气描述,5,地点,6,温度范围\r
-*/\r
-\r
 namespace OHOS\r
 {\r
-    static ImageAnimatorInfo g_imageAnimator1Info[2] = {\r
-        {PNG_ANIMATOR1_IMAGE, {213, 400}, 40, 40, IMG_SRC_FILE_PATH},\r
-        {PNG_ANIMATOR2_IMAGE, {213, 400}, 40, 40, IMG_SRC_FILE_PATH},\r
-    };\r
     static MainWeatherView *g_pMainWeatherView{nullptr};\r
-\r
     MainWeatherView::MainWeatherView()\r
     {\r
-        Time = GetTime();\r
-        WeatherImag = GetWeatherImage();\r
-        Temperature = GetWeatherTemperature();\r
-        WeatherDescription = GetWeatherDescription();\r
-        WeatherArea = GetWeatherArea();\r
-        MaxandMinTemperature = GetWeatherMaxAndMinTemperature();\r
         g_pMainWeatherView = this;\r
     }\r
 \r
     MainWeatherView::~MainWeatherView()\r
     {\r
-        if (viewInitStatus == true)\r
-        {\r
-            DeInitView();\r
-        }\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainWeatherView::~MainWeatherView");\r
+        RootView::GetInstance()->Remove(weatherView);\r
+        delete weatherView;\r
+        weatherView = nullptr;\r
         g_pMainWeatherView = nullptr;\r
     }\r
 \r
-    MainWeatherView *MainWeatherView::GetInstance()\r
-    {\r
-        return g_pMainWeatherView;\r
-    }\r
-\r
-    // 获取时间\r
-    std::string MainWeatherView::GetTime()\r
-    {\r
-        srand(time(0));\r
-        std::string area[] = {"23:54", "12:00", "7:25"};\r
-        int num = rand() % (sizeof(area) / sizeof(area[0]));\r
-        return area[1];\r
-    }\r
-\r
-    // 获取天气图片\r
-    std::string MainWeatherView::GetWeatherImage()\r
-    {\r
-        int size = sizeof(weather130x130) / sizeof(weather130x130[0]);\r
-        return weather130x130[8];\r
-    }\r
-    // 获取温度\r
-\r
-    std::string MainWeatherView::GetWeatherTemperature()\r
-    {\r
-        // 使用系统时间作为种子\r
-        srand(time(0));\r
-        int temperature = rand() % 50;\r
-        return std::to_string(22) + "°";\r
-    }\r
-    // 获取天气描述\r
-\r
-    std::string MainWeatherView::GetWeatherDescription()\r
-    {\r
-        srand(time(0));\r
-        std::string area[] = {"晴", "雨夹雪", "雷阵雨伴有冰雹"};\r
-        int num = rand() % (sizeof(area) / sizeof(area[0]));\r
-        return area[0];\r
-    }\r
-    // 获取天气地区\r
-\r
-    std::string MainWeatherView::GetWeatherArea()\r
-    {\r
-        srand(time(0));\r
-        std::string area[] = {"北京市东城区", "深圳市保安区"};\r
-        int num = rand() % (sizeof(area) / sizeof(area[0]));\r
-        return area[1];\r
-    }\r
-    // 获取最高气温和最低气温\r
-\r
-    std::string MainWeatherView::GetWeatherMaxAndMinTemperature()\r
-    {\r
-        // 使用系统时间作为种子\r
-        srand(time(0));\r
-        // 生成随机数\r
-        int maxtemperature = 20 + rand() % 40; // 最高气温:20°~60°\r
-        int mintemperature = -5 + rand() % 20;\r
-        std::string MaxandMinTemperature = "最高" + std::to_string(22) + "°" + " " + "最低" + std::to_string(18) + "°";\r
-        return MaxandMinTemperature;\r
-    }\r
-\r
-    // 初始化标签\r
-    UILabel *MainWeatherView::InitLabel(int x, int y, const char *text, const char *id, int textfont, int lineheight)\r
-    {\r
-        UILabel *label = new UILabel();\r
-        label->SetPosition(x, y);\r
-        label->Resize(200, 30);\r
-        label->SetViewId(id);\r
-        label->SetStyle(STYLE_TEXT_FONT, textfont);\r
-        label->SetStyle(STYLE_LINE_HEIGHT, lineheight);\r
-        label->SetText(text);\r
-        label->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
-        label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        label->SetRollSpeed(0);\r
-        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, textfont);\r
-        label->SetVisible(true);\r
-        return label;\r
-    }\r
-\r
-    void MainWeatherView::InitView(void)\r
+    void MainWeatherView::OnStart()\r
     {\r
-        if (container_ == nullptr)\r
+        View<MainWeatherPresenter>::OnStart();\r
+        weatherView = new WeatherView();\r
+        if (weatherView == nullptr)\r
         {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainWeatherView::new weatherView fail!");\r
             return;\r
         }\r
-        // Add ScrollView to App\r
-        if (scrollView1_ == nullptr)\r
-        {\r
-            scrollView1_ = new UIScrollView();\r
-        }\r
-        scrollView1_->SetPosition(0, 0);\r
-        scrollView1_->Resize(466, 466);\r
-        scrollView1_->SetViewId("scrollView1");\r
-        scrollView1_->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
-        scrollView1_->SetVerticalScrollState(false);   // 设置纵向是否可滚动。\r
-        scrollView1_->SetHorizontalScrollState(false); // 设置横向是否可滚动。\r
-        container_->Add(scrollView1_);\r
-        scrollView1_->SetVisible(true);\r
-        /* -------------------------------------------------------------------------- */\r
-        if (image1_ == nullptr)\r
-        {\r
-            image1_ = new UIImageView();\r
-        }\r
-        image1_->SetPosition(109, 124);\r
-        image1_->Resize(100, 100);\r
-        image1_->SetViewId("image1");\r
-        image1_->SetSrc(WeatherImag.c_str());\r
-        scrollView1_->Add(image1_);\r
-        image1_->SetVisible(true);\r
-        /* -------------------------------------------------------------------------- */\r
-        label1_ = InitLabel(185, 52, Time.c_str(), "label1", 40, 47);\r
-        scrollView1_->Add(label1_);\r
-        /* -------------------------------------------------------------------------- */\r
-        label2_ = InitLabel(249, 126, Temperature.c_str(), "label2", 100, 125);\r
-        scrollView1_->Add(label2_);\r
-        /* -------------------------------------------------------------------------- */\r
-        showWeatherDescriptionLabel = new UILabel();\r
-        if (showWeatherDescriptionLabel == nullptr)\r
-        {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "WeatherView::new showWeatherDescriptionLabel fail!");\r
-            return ;\r
-        }\r
-        showWeatherDescriptionLabel->SetPosition(83, 264,300,40);\r
-        showWeatherDescriptionLabel->SetViewId("showWeatherDescriptionLabel");\r
-        showWeatherDescriptionLabel->SetStyle(STYLE_TEXT_FONT, 35);\r
-        showWeatherDescriptionLabel->SetStyle(STYLE_LINE_HEIGHT, 41);\r
-        showWeatherDescriptionLabel->SetText(WeatherDescription.c_str());\r
-        showWeatherDescriptionLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
-        showWeatherDescriptionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-        showWeatherDescriptionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 35);\r
-        scrollView1_->Add(showWeatherDescriptionLabel);\r
-        /* -------------------------------------------------------------------------- */\r
-        label4_ = InitLabel(155, 330, WeatherArea.c_str(), "label4", 26, 30);\r
-        label4_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));\r
-        scrollView1_->Add(label4_);\r
-        /* -------------------------------------------------------------------------- */\r
-        label5_ = InitLabel(158, 368, MaxandMinTemperature.c_str(), "label5", 20, 23);\r
-        label5_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));\r
-        scrollView1_->Add(label5_);\r
-        /* -------------------------------------------------------------------------- */\r
-        #if 0\r
-        // Add ImageAnimatorView to App\r
-        if (imageAnimator1_ == nullptr)\r
+        UIView::OnDragListener *weatherDragListener = (UIView::OnDragListener *)OHOS::MainWeatherPresenter::GetInstance();\r
+        if (weatherDragListener == nullptr)\r
         {\r
-            imageAnimator1_ = new UIImageAnimatorView();\r
-        }\r
-        imageAnimator1_->SetPosition(213, 400);\r
-        imageAnimator1_->Resize(40, 40);\r
-        imageAnimator1_->SetViewId("imageAnimator1");\r
-        imageAnimator1_->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
-\r
-        // Set additional property\r
-        imageAnimator1_->SetImageAnimatorSrc(g_imageAnimator1Info, 2, 200);\r
-        imageAnimator1_->SetTimeOfPause(200);\r
-        imageAnimator1_->SetRepeatTimes(1);\r
-        imageAnimator1_->SetReverse(true);\r
-        imageAnimator1_->Start();\r
-\r
-        // Add to scrollView1\r
-        scrollView1_->Add(imageAnimator1_);\r
-        imageAnimator1_->SetVisible(true);\r
-        #endif\r
-    }\r
-\r
-    void MainWeatherView::DeInitView()\r
-    {\r
-        container_->RemoveAll();\r
-        scrollView1_->RemoveAll();\r
-        if (label1_ != nullptr)\r
-        {\r
-            delete label1_;\r
-            label1_ = nullptr;\r
-        }\r
-        if (label2_ != nullptr)\r
-        {\r
-            delete label2_;\r
-            label2_ = nullptr;\r
-        }\r
-        if (image1_ != nullptr)\r
-        {\r
-            delete image1_;\r
-            image1_ = nullptr;\r
-        }\r
-        if (showWeatherDescriptionLabel != nullptr)\r
-        {\r
-            delete showWeatherDescriptionLabel;\r
-            showWeatherDescriptionLabel = nullptr;\r
-        }\r
-        if (label4_ != nullptr)\r
-        {\r
-            delete label4_;\r
-            label4_ = nullptr;\r
-        }\r
-        if (label5_ != nullptr)\r
-        {\r
-            delete label5_;\r
-            label5_ = nullptr;\r
-        }\r
-        if (imageAnimator1_ != nullptr)\r
-        {\r
-            imageAnimator1_->Stop(); // 视图退出后动画停止\r
-            delete imageAnimator1_;\r
-            imageAnimator1_ = nullptr;\r
-        }\r
-        if (scrollView1_ != nullptr)\r
-        {\r
-            delete scrollView1_;\r
-            scrollView1_ = nullptr;\r
-        }\r
-        if (container_ != nullptr)\r
-        {\r
-            delete container_;\r
-            container_ = nullptr;\r
-        }\r
-    }\r
-\r
-    void MainWeatherView::PreLoad(void)\r
-    {\r
-        if (!viewInitStatus)\r
-        {\r
-            InitView();\r
-            viewInitStatus = true;\r
-        }\r
-    }\r
-    void MainWeatherView::OnStart()\r
-    {\r
-        View<MainWeatherPresenter>::OnStart();\r
-        if (container_ == nullptr)\r
-        {\r
-            container_ = new UIViewGroup();\r
-            container_->Resize(466, 466);\r
-            container_->SetTouchable(true);\r
-            container_->SetDraggable(true);\r
-            UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(MainWeatherPresenter::GetInstance());\r
-            container_->SetOnDragListener(draglistener);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "weatherDragListener new fail");\r
+            return;\r
         }\r
-        PreLoad();\r
-        RootView::GetInstance()->Add(container_);\r
+        weatherView->SetOnDragListener(weatherDragListener);\r
+        weatherView->InitView();\r
+        RootView::GetInstance()->Add(weatherView);\r
         // 增加按键监听\r
         RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::MainWeatherPresenter::GetInstance();\r
         RootView::GetInstance()->SetOnKeyActListener(keyactListener);\r