1.解决语言界面内存泄漏问题
authorluozheng <1732036298@qq.com>
Thu, 19 Sep 2024 12:53:58 +0000 (20:53 +0800)
committerluozheng <1732036298@qq.com>
Thu, 19 Sep 2024 12:53:58 +0000 (20:53 +0800)
2.解决.#741语言选择界面上滑时底部会有黑边,使用编码器时无此情况bug
3.解决系统界面的内存泄漏问题,并使用一个辅助组件解决系统视图最后一个按钮被则挡住bug

code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchListitemView.cpp
code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp
code/sdk/application/wearable/fd230app/nativeui/system/include/SystemView.h
code/sdk/application/wearable/fd230app/nativeui/system/src/SystemView.cpp

index 1a584fd..5f63bca 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-03-28 14:28:03
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-08-30 20:49:17
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-09-19 16:35:47
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchListitemView.cpp
  */
 #include "languagecode/include/LanguageSwitchListitemView.h"
@@ -28,6 +28,7 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListitemView::~LanguageSwitchListitemView");
         Remove(&m_LabelButtonExt);
+        Remove(&languae_Image);
     }
 
     void LanguageSwitchListitemView::SetItemInfo(const Language itemInfo)
index 58e906b..de74878 100644 (file)
@@ -19,8 +19,8 @@ namespace OHOS
     static constexpr int16_t MAX_SCROLL_DIS = 1000;
     static constexpr int16_t MAX_REBOUND_SIZE = 40;
     static constexpr int16_t MAX_LANGUAGE_LIST_SCROLLBLANKSIZE = 50;
-    static constexpr int16_t ROTATEFACTORVALUE = 4;
-    
+    static constexpr int16_t ROTATEFACTORVALUE = 1.0;
+
     static LanguageSwitchView *g_pLanguageSwitchView{nullptr};
     LanguageSwitchView::LanguageSwitchView()
     {
@@ -59,35 +59,56 @@ namespace OHOS
 
     void LanguageSwitchView::ClearAll(void)
     {
-        if (LanguageSwitchScrollView != nullptr)
+        if (container_ != nullptr)
         {
-            LanguageSwitchScrollView->RemoveAll();
-
-            delete LanguageSwitchViewTitleLabel;
-            LanguageSwitchViewTitleLabel = nullptr;
-
-            delete p_LanguageSwitchListAdapter;
-            p_LanguageSwitchListAdapter = nullptr;
-
-            delete LanguageList;
-            LanguageList = nullptr;
-
-            delete LanguageSwitchScrollView;
-            LanguageSwitchScrollView = nullptr;
-
-            if(group)
+            container_->RemoveAll();
+            if (LanguageSwitchScrollView != nullptr)
+            {
+                LanguageSwitchScrollView->RemoveAll();
+                if (LanguageSwitchViewTitleLabel)
+                {
+                    delete LanguageSwitchViewTitleLabel;
+                    LanguageSwitchViewTitleLabel = nullptr;
+                }
+                if (p_LanguageSwitchListAdapter)
+                {
+                    delete p_LanguageSwitchListAdapter;
+                    p_LanguageSwitchListAdapter = nullptr;
+                }
+                if (LanguageList)
+                {
+                    delete LanguageList;
+                    LanguageList = nullptr;
+                }
+                delete LanguageSwitchScrollView;
+                LanguageSwitchScrollView = nullptr;
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll LanguageSwitchScrollView over!!");
+            }
+            if (group != nullptr)
             {
                 group->RemoveAll();
-
-                delete button_cancel;
-                button_cancel = nullptr;
-
-                delete button_ensure;
-                button_ensure = nullptr;
-
-                delete LanguageSwitchViewhintLabel;
-                LanguageSwitchViewhintLabel = nullptr;
+                if (button_cancel)
+                {
+                    delete button_cancel;
+                    button_cancel = nullptr;
+                }
+                if (button_ensure)
+                {
+                    delete button_ensure;
+                    button_ensure = nullptr;
+                }
+                if (LanguageSwitchViewhintLabel)
+                {
+                    delete LanguageSwitchViewhintLabel;
+                    LanguageSwitchViewhintLabel = nullptr;
+                }
+                delete group;
+                group = nullptr;
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll group over!!");
             }
+            delete container_;
+            container_ = nullptr;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll over!!");
         }
     }
 
@@ -101,7 +122,7 @@ namespace OHOS
             return false;
         }
         LanguageSwitchScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        LanguageSwitchScrollView->SetScrollBlankSize(MAX_LANGUAGE_LIST_SCROLLBLANKSIZE);
+        // LanguageSwitchScrollView->SetScrollBlankSize(MAX_LANGUAGE_LIST_SCROLLBLANKSIZE);
         LanguageSwitchScrollView->SetHorizontalScrollState(false);
         LanguageSwitchScrollView->SetTouchable(true);
         LanguageSwitchScrollView->SetDraggable(true);
@@ -149,15 +170,18 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageList is nullptr!");
             return false;
         }
-        LanguageList->SetPosition(LANGUAGE_LIST_X, LANGUAGE_LIST_Y, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+        LanguageList->SetPosition(LANGUAGE_LIST_X, LANGUAGE_LIST_Y, HORIZONTAL_RESOLUTION, 346);
         LanguageList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
-        LanguageList->SetScrollBlankSize(MAX_LANGUAGE_LIST_SCROLLBLANKSIZE);
-        LanguageList->EnableAutoAlign(true);                // 设置此列表的自动对齐状态。当滚动停止时,子视图被选中,其位置自动与预设位置对齐
-        LanguageList->SetThrowDrag(true);                   // 设置手指抬起屏幕后是否继续滚动。
-        LanguageList->SetMaxScrollDistance(MAX_SCROLL_DIS); // 设置手指抬起屏幕后的最大滚动距离。
-        LanguageList->SetReboundSize(MAX_REBOUND_SIZE);
-        LanguageList->SetRotateFactor(ROTATEFACTORVALUE);
+        LanguageList->EnableAutoAlign(true);      // 设置此列表的自动对齐状态。当滚动停止时,子视图被选中,其位置自动与预设位置对齐
+        LanguageList->SetThrowDrag(true);         // 设置手指抬起屏幕后是否继续滚动。
+        LanguageList->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。
+        LanguageList->SetSwipeACCLevel(800);      /*设置手指抬起屏幕后的补偿距离。*/
+        LanguageList->SetReboundSize(30);
+        LanguageList->SetScrollBlankSize(20);
+        LanguageList->SetStartIndex(0);
         FocusManager::GetInstance()->RequestFocus(LanguageList);
+        FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP);
+        LanguageList->SetRotateFactor(1.0);
         return true;
     }
 
@@ -171,13 +195,13 @@ namespace OHOS
         }
     }
 
-    void LanguageSwitchView::show_hint_group(std::string code,bool data)
+    void LanguageSwitchView::show_hint_group(std::string code, bool data)
     {
         group->SetVisible(data);
         RootView::GetInstance()->Invalidate();
-        if(data)
+        if (data)
         {
-            hint_id_code=code;
+            hint_id_code = code;
         }
         return;
     }
@@ -187,18 +211,16 @@ namespace OHOS
         return button_cancel;
     }
 
-
     UIButton *LanguageSwitchView::GetLanguagebutton_ensure(void)
     {
         return button_ensure;
     }
 
-    //Take effect after restart
+    // Take effect after restart
     void LanguageSwitchView::InithintView()
     {
-
         group = new UIViewGroup();
-        if(group==nullptr)
+        if (group == nullptr)
         {
             return;
         }
@@ -207,13 +229,13 @@ namespace OHOS
         group->SetDraggable(true);
         group->SetOnDragListener(presenter_);
 
-
-        if (LanguageSwitchViewhintLabel == nullptr) {
-        LanguageSwitchViewhintLabel = new UILabel();
+        if (LanguageSwitchViewhintLabel == nullptr)
+        {
+            LanguageSwitchViewhintLabel = new UILabel();
         }
-        LanguageSwitchViewhintLabel->SetPosition(47, 194);         // widget's left position and top position
-        LanguageSwitchViewhintLabel->Resize(370, 60);          // widget's width and height
-        LanguageSwitchViewhintLabel->SetViewId("label1");// Set style
+        LanguageSwitchViewhintLabel->SetPosition(47, 194); // widget's left position and top position
+        LanguageSwitchViewhintLabel->Resize(370, 60);      // widget's width and height
+        LanguageSwitchViewhintLabel->SetViewId("label1");  // Set style
         LanguageSwitchViewhintLabel->SetStyle(STYLE_TEXT_FONT, 30);
 
         LanguageSwitchViewhintLabel->SetText("Take effect after restart");
@@ -225,13 +247,11 @@ namespace OHOS
         group->Add(LanguageSwitchViewhintLabel);
         LanguageSwitchViewhintLabel->SetVisible(true);
 
-
-
         button_cancel = new UIButton();
         if (button_cancel == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemShutdown::new button_cancel fail!");
-            return ;
+            return;
         }
         button_cancel->SetPosition(97, 299, 130, 130);
         button_cancel->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
@@ -247,7 +267,7 @@ namespace OHOS
         if (button_ensure == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemShutdown::new button_ensure fail!");
-            return ;
+            return;
         }
         button_ensure->SetPosition(240, 299, 130, 130);
         button_ensure->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
@@ -262,15 +282,18 @@ namespace OHOS
         button_cancel->SetOnClickListener(presenter_);
         button_ensure->SetOnClickListener(presenter_);
         group->SetVisible(false);
-
     }
 
-
     void LanguageSwitchView::OnStart()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStart");
         View<LanguageSwitchPresenter>::OnStart();
         SetContainerView(new UIViewGroup());
+        if (GetContainer() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetContainerView fail!!");
+            return;
+        }
         container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
         container_->SetTouchable(true);
         container_->SetDraggable(true);
@@ -303,12 +326,6 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStop");
         View<LanguageSwitchPresenter>::OnStop();
-        if (container_ != nullptr)
-        {
-            container_->RemoveAll();
-            delete container_;
-            container_ = nullptr;
-        }
         RootView::GetInstance()->ClearOnKeyActListener();
         FocusManager::GetInstance()->ClearFocus();
         ClearAll();
index 14afb96..16239fa 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-03-30 18:29:39\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-28 19:43:28\r
+ * @LastEditTime: 2024-09-19 20:07:09\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/system/include/SystemView.h\r
  */\r
 #ifndef SYSTEM_VIEW_H\r
@@ -111,9 +111,10 @@ namespace OHOS
         void NeedToUpdateImageinit(void);\r
         UILabelExt *Title{nullptr}; // 标题\r
         UIScrollView *SystemScrollView[MAX_SYSTEMVIEWID]{nullptr};\r
-        UILabelButtonExt *SystemViewLabelButton[5]{nullptr};\r
-        UILabelExt *SystemViewLabel[5]{nullptr};\r
+        UILabelButtonExt *SystemViewLabelButton[7]{nullptr};\r
+        UILabelExt *SystemViewLabel[7]{nullptr};\r
         UIImageView *NeedToUpdateImage{nullptr}; // 提示需要系统更新的icon图片\r
+        UIImageView *temp{nullptr};\r
         bool viewInitStatus{false};\r
     };\r
 } // namespace OHOS\r
index 182c659..19dbe79 100644 (file)
@@ -39,7 +39,7 @@ namespace OHOS
                     delete Title;\r
                     Title = nullptr;\r
                 }\r
-                for (int i = 0; i < 5; i++)\r
+                for (int i = 0; i < sizeof(SystemViewLabelButton) / sizeof(SystemViewLabelButton[0]); i++)\r
                 {\r
                     if (SystemViewLabelButton[i] != nullptr)\r
                     {\r
@@ -58,6 +58,11 @@ namespace OHOS
                     delete NeedToUpdateImage;\r
                     NeedToUpdateImage = nullptr;\r
                 }\r
+                if (temp != nullptr)\r
+                {\r
+                    delete temp;\r
+                    temp = nullptr;\r
+                }\r
                 delete SystemScrollView[SYSTEMVIEW];\r
                 SystemScrollView[SYSTEMVIEW] = nullptr;\r
             }\r
@@ -131,7 +136,7 @@ namespace OHOS
 \r
     bool SystemView::CreateSystemViewLabel(void)\r
     {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemViewLabel");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemViewLabel");\r
         LabelConfig labelConfig = {\r
             .left = 83,\r
             .top = 50,\r
@@ -195,7 +200,7 @@ namespace OHOS
 \r
     bool SystemView::CreateSystemViewLabelButton(void)\r
     {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemViewLabelButton");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemViewLabelButton");\r
         struct ButtonSetup\r
         {\r
             int y;\r
@@ -234,7 +239,7 @@ namespace OHOS
 \r
     bool SystemView::CreateSystemScrollView(void)\r
     {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemScrollView");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemScrollView");\r
         SystemScrollView[SYSTEMVIEW] = new UIScrollView();\r
         if (SystemScrollView[SYSTEMVIEW] == nullptr)\r
         {\r
@@ -243,12 +248,14 @@ namespace OHOS
         }\r
         SystemScrollView[SYSTEMVIEW]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
         SystemScrollView[SYSTEMVIEW]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
-        SystemScrollView[SYSTEMVIEW]->SetScrollBlankSize(75);\r
-        SystemScrollView[SYSTEMVIEW]->SetReboundSize(35);\r
+        SystemScrollView[SYSTEMVIEW]->SetScrollBlankSize(30);\r
+        SystemScrollView[SYSTEMVIEW]->SetReboundSize(30);\r
         SystemScrollView[SYSTEMVIEW]->SetDirection(1);\r
         SystemScrollView[SYSTEMVIEW]->SetThrowDrag(true);         // 设置手指抬起屏幕后是否继续滚动。\r
         SystemScrollView[SYSTEMVIEW]->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。\r
-        SystemScrollView[SYSTEMVIEW]->RequestFocus();\r
+        SystemScrollView[SYSTEMVIEW]->SetSwipeACCLevel(800);      /*设置手指抬起屏幕后的补偿距离。*/\r
+        FocusManager::GetInstance()->RequestFocus(SystemScrollView[SYSTEMVIEW]);\r
+        FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP);\r
         SystemScrollView[SYSTEMVIEW]->SetRotateFactor(1.0);\r
         SystemScrollView[SYSTEMVIEW]->SetOnDragListener(presenter_);\r
         SystemScrollView[SYSTEMVIEW]->SetTouchable(true);\r
@@ -279,12 +286,22 @@ namespace OHOS
 \r
     void SystemView::CreateSystemView(void)\r
     {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemView");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemView");\r
         if (!CreateSystemScrollView() || !CreateSystemViewLabelButton() || !CreateSystemViewLabel())\r
         {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemView");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::CreateSystemView fail!!");\r
             return;\r
         }\r
+        if (temp == nullptr)\r
+        {\r
+            temp = new UIImageView();\r
+            if (temp == nullptr)\r
+            {\r
+                return;\r
+            }\r
+            temp->SetPosition(43, 960, 380, 40);\r
+            SystemScrollView[SYSTEMVIEW]->Add(temp);\r
+        }\r
         viewInitStatus = true;\r
     }\r
 \r