From 153c0deb6703a67dbaf64ac3c8f375ff183b048b Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Wed, 21 Feb 2024 19:09:56 +0800 Subject: [PATCH] =?utf8?q?=E5=A3=B0=E9=9F=B3=E4=B8=8E=E9=9C=87=E5=8A=A8?= =?utf8?q?=E8=A7=86=E5=9B=BE=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4=E5=B8=A6?= =?utf8?q?=E6=96=87=E5=AD=97=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../src/DisplayBrightnessView.cpp | 2 +- .../include/SoundAndVibrationView.h | 58 +-- .../SoundAndVibrationVolumeSettingView.h | 6 +- .../include/SystemVolumeView.h | 6 +- .../src/SoundAndVibrationPresenter.cpp | 2 +- .../src/SoundAndVibrationView.cpp | 402 +++++++++++++----- .../SoundAndVibrationVolumeSettingView.cpp | 40 +- .../src/SystemVolumeView.cpp | 12 +- .../res/SoundAndVibration/CALL_VOLUME.bin | Bin 25624 -> 0 bytes .../res/SoundAndVibration/MEDIA_VOLUME.bin | Bin 25624 -> 0 bytes .../res/SoundAndVibration/SYSTEM_VOLUME.bin | Bin 25624 -> 0 bytes 11 files changed, 355 insertions(+), 173 deletions(-) delete mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SoundAndVibration/CALL_VOLUME.bin delete mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SoundAndVibration/MEDIA_VOLUME.bin delete mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SoundAndVibration/SYSTEM_VOLUME.bin diff --git a/code/sdk/application/wearable/fd230app/nativeui/displaybrightness/src/DisplayBrightnessView.cpp b/code/sdk/application/wearable/fd230app/nativeui/displaybrightness/src/DisplayBrightnessView.cpp index 1c7580dcd..c7228dd68 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/displaybrightness/src/DisplayBrightnessView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/displaybrightness/src/DisplayBrightnessView.cpp @@ -119,7 +119,7 @@ namespace OHOS DisplayBrightnessTitleLabel->SetStyle(STYLE_BACKGROUND_OPA, 0xff); DisplayBrightnessTitleLabel->SetStyle(STYLE_TEXT_FONT, 30); DisplayBrightnessTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35); - DisplayBrightnessTitleLabel->SetText("显示与亮度"); + DisplayBrightnessTitleLabel->SetText("屏幕与亮度"); DisplayBrightnessTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); DisplayBrightnessTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); DisplayBrightnessTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationView.h b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationView.h index 1897a02d7..9100117e1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationView.h @@ -17,7 +17,7 @@ namespace OHOS /* ---------------------------------- 组件ID ---------------------------------- */ static const char *SYSTEM_VOLUME_BUTTON = "SystemVolumeButton"; // 系统音量按钮ID static const char *CALL_VOLUME_BUTTON = "CallVolumeButton"; // 通话音量按钮ID - static const char *MEDIAVOLUMEBUTTON = "MediaVolumeButton"; // 媒体音量按钮ID + static const char *MEDIA_VOLUME_BUTTON = "MediaVolumeButton"; // 媒体音量按钮ID static const char *VIBRATION_REMINDER_TOGGLEBUTTON = "VibrationReminderToggleButton"; // 震动提醒 static const char *SILENT_MODEL_TOGGLEBUTTON = "SilentModeToggleButton"; // 静音模式 class SoundAndVibrationPresenter; @@ -27,10 +27,10 @@ namespace OHOS public: struct ImageConfig { - int x; - int y; - int w; - int h; + int16_t x; + int16_t y; + int16_t w; + int16_t h; const char *ImageSrc; }; struct LabelConfig @@ -46,12 +46,13 @@ namespace OHOS }; struct ButtonConfig { - int x; - int y; - int w; - int h; + int16_t x; + int16_t y; + int16_t w; + int16_t h; const char *ViewId; - const char *ImageSrc; + int64_t BackgroundColorValue; // 按钮背景颜色值 + int64_t TriggeredBackgroundColorValue; // 点击按钮触发的背景颜色值 }; SoundAndVibrationView(); virtual ~SoundAndVibrationView(); @@ -65,25 +66,34 @@ namespace OHOS private: void InitView(void); void ClearAll(void); - bool SetUpSoundAndVibrationScrollView(void); - bool SetUpTitle(void); UIButton *SetUpButton(ButtonConfig &buttonconfig, UIView::OnClickListener *clickListener); UIImageView *SetUpImageVIew(ImageConfig &imageconfig); UILabel *SetUpLabel(LabelConfig &labelConfig); + bool InitSoundAndVibrationScrollView(void); + bool InitSoundAndVibrationViewTitleLabel(void); + bool InitSoundAndVibrationButtonView(void); + bool SetUpButtonAndCheck(const char *viewId, int x, int y, UIButton *&button, UIView::OnClickListener *listener); + bool InitSoundAndVibrationImageView(void); + bool InitSoundAndVibrationLabel(void); + bool InitSoundAndVibrationToggleButton(void); private: - UIScrollView *SoundAndVibrationScrollView = nullptr; - UILabel *Title = nullptr; - UIButton *SystemVolumeButton = nullptr; - UIButton *CallVolumeButton = nullptr; - UIButton *MediaVolumeButton = nullptr; - UIImageView *Background[2]{nullptr}; // 放组件的背景 - UILabel *VibrationReminderLabel = nullptr; // 震动提醒 - UILabel *SilentModeLabel = nullptr; // 静音模式 - UILabel *SilentModeLabel_ = nullptr; // 系统音量不受影响 - UIToggleButton *VibrationReminderToggleButton = nullptr; - UIToggleButton *SilentModeToggleButton = nullptr; - + UIScrollView *SoundAndVibrationScrollView{nullptr}; + UILabel *Title{nullptr}; // 标题:“声音与震动” + UIButton *SystemVolumeButton{nullptr}; // 系统音量按钮 + UIButton *CallVolumeButton{nullptr}; // 通话音量按钮 + UIButton *MediaVolumeButton{nullptr}; // 媒体音量按钮 + UILabel *SystemVolumeLabel{nullptr}; // 系统音量标签 + UILabel *CallVolumeLabel{nullptr}; // 通话音量标签 + UILabel *MediaVolumeLabel{nullptr}; // 媒体音量标签 + UILabel *VibrationReminderLabel{nullptr}; // 震动提醒标签 + UILabel *SilentModeLabel{nullptr}; // 静音模式标签 + UILabel *reminder[4]{nullptr}; // 提示标签 + UIImageView *nextImageView[3]{nullptr}; // 箭头图片 + UIImageView *VibrationReminderImageView{nullptr}; // + UIImageView *SilentModeImageView{nullptr}; // + UIToggleButton *VibrationReminderToggleButton{nullptr}; // 震动提醒切换按钮 + UIToggleButton *SilentModeToggleButton{nullptr}; // 静音模式切换按钮 bool initViewStatus{false}; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationVolumeSettingView.h b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationVolumeSettingView.h index 9c6803d5f..7aa75ea4f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationVolumeSettingView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SoundAndVibrationVolumeSettingView.h @@ -3,7 +3,7 @@ #include "BaseView.h" #include "View.h" -#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" #include "components/ui_slider.h" #include "components/ui_image_view.h" @@ -23,10 +23,10 @@ namespace OHOS SoundAndVibrationVolumeSettingView(); ~SoundAndVibrationVolumeSettingView(); static SoundAndVibrationVolumeSettingView *GetInstance(void); - UIViewGroup * SetUpVolumeProcess(void); + UIScrollView * SetUpVolumeProcess(void); void ClearAll(void); private: - UIViewGroup *group{nullptr}; + UIScrollView *ScrollView{nullptr}; UISlider *VolumeProcess{nullptr}; UIImageView *VolumeVetor{nullptr}; bool initViewStatus{false}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SystemVolumeView.h b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SystemVolumeView.h index b45eadebd..af359213e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SystemVolumeView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/include/SystemVolumeView.h @@ -3,7 +3,7 @@ #include "BaseView.h" #include "View.h" -#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" #include "soundandvibration/include/SoundAndVibrationVolumeSettingView.h" namespace OHOS { @@ -23,10 +23,10 @@ namespace OHOS void OnTearDownView() override; void OnStop() override; - UIViewGroup * SystemVolumeViewInit(void); + UIScrollView * SystemVolumeViewInit(void); private: - UIViewGroup *group{nullptr}; + UIScrollView *SystemVolumeScrollView{nullptr}; SoundAndVibrationVolumeSettingView *p_SoundAndVibrationVolumeSettingView{nullptr}; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp index 6eacd8b40..df4df048d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp @@ -68,7 +68,7 @@ namespace OHOS{ { NativeAbility::GetInstance().ChangeSlice(VIEW_SYSTEM_VOLUME); return true; - }else if(strcmp(view.GetViewId(), MEDIAVOLUMEBUTTON) == 0) + }else if(strcmp(view.GetViewId(), MEDIA_VOLUME_BUTTON) == 0) { NativeAbility::GetInstance().ChangeSlice(VIEW_SYSTEM_VOLUME); return true; diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationView.cpp b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationView.cpp index c9df18bc2..0c8da83ef 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationView.cpp @@ -47,76 +47,57 @@ namespace OHOS Title = nullptr; delete SystemVolumeButton; SystemVolumeButton = nullptr; + delete CallVolumeButton; CallVolumeButton = nullptr; + delete MediaVolumeButton; MediaVolumeButton = nullptr; - for (int i = 0; i < 2; i++) - { - delete Background[i]; - Background[i] = nullptr; - } + + delete SystemVolumeLabel; + SystemVolumeLabel = nullptr; + + delete CallVolumeLabel; + CallVolumeLabel = nullptr; + + delete MediaVolumeLabel; + MediaVolumeLabel = nullptr; + delete VibrationReminderLabel; VibrationReminderLabel = nullptr; + delete SilentModeLabel; SilentModeLabel = nullptr; - delete SilentModeLabel_; - SilentModeLabel_ = nullptr; + + for (int i = 0; i < 4; i++) + { + delete reminder[i]; + reminder[i] = nullptr; + } + + for (int i = 0; i < 3; i++) + { + delete nextImageView[i]; + nextImageView[i] = nullptr; + } + + delete VibrationReminderImageView; + VibrationReminderImageView = nullptr; + + delete SilentModeImageView; + SilentModeImageView; + delete VibrationReminderToggleButton; VibrationReminderToggleButton = nullptr; + delete SilentModeToggleButton; SilentModeToggleButton = nullptr; + delete SoundAndVibrationScrollView; SoundAndVibrationScrollView = nullptr; } } - bool SoundAndVibrationView::SetUpSoundAndVibrationScrollView(void) - { - SoundAndVibrationScrollView = new UIScrollView(); - if (SoundAndVibrationScrollView == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::new SoundAndVibrationScrollView fail!"); - return false; - } - SoundAndVibrationScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); - SoundAndVibrationScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); - SoundAndVibrationScrollView->SetScrollBlankSize(35); - SoundAndVibrationScrollView->SetReboundSize(50); - SoundAndVibrationScrollView->SetDirection(1); - UIView::OnDragListener *draglistener = static_cast(SoundAndVibrationPresenter::GetInstance()); - if (draglistener == nullptr) - { - return false; - } - SoundAndVibrationScrollView->SetOnDragListener(draglistener); - SoundAndVibrationScrollView->SetTouchable(true); - SoundAndVibrationScrollView->SetDraggable(true); - - return true; - } - - // 设置标题 - bool SoundAndVibrationView::SetUpTitle(void) - { - Title = new UILabel(); - if (Title == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::new Title fail!"); - return false; - } - Title->SetPosition(158, 52); - Title->SetStyle(STYLE_TEXT_FONT, 30); - Title->SetStyle(STYLE_LINE_HEIGHT, 35); - Title->SetText("声音与震动"); - Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); - Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - Title->SetRollSpeed(6); - Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - - return true; - } - /// @brief 设置按钮 /// @param button /// @return true 设置成功,false 失败 @@ -129,9 +110,8 @@ namespace OHOS } button->SetPosition(buttonconfig.x, buttonconfig.y, buttonconfig.w, buttonconfig.h); button->SetViewId(buttonconfig.ViewId); - button->SetImageSrc(buttonconfig.ImageSrc, buttonconfig.ImageSrc); - button->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); - button->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + button->SetStyle(STYLE_BACKGROUND_COLOR, buttonconfig.BackgroundColorValue); + button->SetStyleForState(STYLE_BACKGROUND_COLOR, buttonconfig.TriggeredBackgroundColorValue, UIButton::PRESSED); button->SetOnClickListener(clickListener); return button; } @@ -166,53 +146,120 @@ namespace OHOS label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelConfig.fontSize); return label; } - void SoundAndVibrationView::InitView(void) + + /// @brief 声音与震动视图"scrollView"视图初始化 + /// @param void + /// @return true 初始化成功 false 初始化失败 + bool SoundAndVibrationView::InitSoundAndVibrationScrollView(void) { - if (SetUpSoundAndVibrationScrollView() == false) + SoundAndVibrationScrollView = new UIScrollView(); + if (SoundAndVibrationScrollView == nullptr) { - return; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::new SoundAndVibrationScrollView fail!"); + return false; } - if (SetUpTitle() == false) + SoundAndVibrationScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + SoundAndVibrationScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + SoundAndVibrationScrollView->SetScrollBlankSize(35); + SoundAndVibrationScrollView->SetReboundSize(50); + SoundAndVibrationScrollView->SetDirection(1); + UIView::OnDragListener *draglistener = static_cast(SoundAndVibrationPresenter::GetInstance()); + if (draglistener == nullptr) { - return; + return false; } + SoundAndVibrationScrollView->SetOnDragListener(draglistener); + SoundAndVibrationScrollView->SetTouchable(true); + SoundAndVibrationScrollView->SetDraggable(true); + + return true; + } + + /// @brief 声音与震动视图"标题"标签初始化 + /// @param void + /// @return true 初始化成功 false 初始化失败 + bool SoundAndVibrationView::InitSoundAndVibrationViewTitleLabel(void) + { + Title = new UILabel(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::new Title fail!"); + return false; + } + Title->SetPosition(158, 52); + Title->SetStyle(STYLE_TEXT_FONT, 30); + Title->SetStyle(STYLE_LINE_HEIGHT, 35); + Title->SetText("声音与震动"); + Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + Title->SetRollSpeed(6); + Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + + return true; + } + + /// @brief 声音与震动视图"按钮"初始化 + /// @param void + /// @return true 初始化成功 false 初始化失败 + bool SoundAndVibrationView::InitSoundAndVibrationButtonView(void) + { UIView::OnClickListener *ButtonClick = static_cast(SoundAndVibrationPresenter::GetInstance()); + if (ButtonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SoundAndVibrationPresenter::GetInstance() fail!"); + return false; + } /* --------------------------- SystemVolumeButton --------------------------- */ - ButtonConfig buttonconfig = { - .x = 43, - .y = 120, - .w = 380, - .h = 100, - .ViewId = SYSTEM_VOLUME_BUTTON, - .ImageSrc = PNG_SYSTEM_VOLUME_IMAGE, - }; - SystemVolumeButton = SetUpButton(buttonconfig, ButtonClick); - if (SystemVolumeButton == nullptr) + if (!SetUpButtonAndCheck(SYSTEM_VOLUME_BUTTON, 43, 120, SystemVolumeButton, ButtonClick)) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SoundAndVibrationView::SetTheButton: SystemVolumeButton is nullptr!"); - return; + return false; } + /* ---------------------------- CallVolumeButton ---------------------------- */ - buttonconfig.y = 240; - buttonconfig.ViewId = CALL_VOLUME_BUTTON; - buttonconfig.ImageSrc = PNG_CALL_VOLUME_IMAGE; - CallVolumeButton = SetUpButton(buttonconfig, ButtonClick); - if (SystemVolumeButton == nullptr) + if (!SetUpButtonAndCheck(CALL_VOLUME_BUTTON, 43, 240, CallVolumeButton, ButtonClick)) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SoundAndVibrationView::SetTheButton: CallVolumeButton is nullptr!"); - return; + return false; } + /* ---------------------------- MediaVolumeButton --------------------------- */ - buttonconfig.y = 360; - buttonconfig.ViewId = MEDIAVOLUMEBUTTON; - buttonconfig.ImageSrc = PNG_MEDIA_VOLUME_IMAGE; - MediaVolumeButton = SetUpButton(buttonconfig, ButtonClick); - if (SystemVolumeButton == nullptr) + if (!SetUpButtonAndCheck(MEDIA_VOLUME_BUTTON, 43, 360, MediaVolumeButton, ButtonClick)) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SoundAndVibrationView::SetTheButton: MediaVolumeButton is nullptr!"); - return; + return false; } - /* ------------------------------- Background ------------------------------- */ + + return true; + } + + /// @brief 为指定的按钮设置属性并进行错误检查 + /// @param viewId + /// @param x + /// @param y + /// @param button + /// @param listener + /// @return true 设置成功 false 设置失败 + bool SoundAndVibrationView::SetUpButtonAndCheck(const char *viewId, int x, int y, UIButton *&button, UIView::OnClickListener *listener) + { + ButtonConfig buttonconfig = { + .x = x, + .y = y, + .w = 380, + .h = 100, + .ViewId = viewId, + .BackgroundColorValue = 0xff191919, + .TriggeredBackgroundColorValue = 0xff29b862, + }; + + button = SetUpButton(buttonconfig, listener); + if (button == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " SoundAndVibrationView::SetUpButtonAndCheck: Button is nullptr!"); + return false; + } + return true; + } + + bool SoundAndVibrationView::InitSoundAndVibrationImageView() + { ImageConfig imageconfig = { .x = 43, .y = 480, @@ -220,35 +267,88 @@ namespace OHOS .h = 100, .ImageSrc = "/user/res/SETTING_BACKGROUND.bin", }; - Background[0] = SetUpImageVIew(imageconfig); - if (Background[0] == nullptr) + + VibrationReminderImageView = SetUpImageVIew(imageconfig); + if (VibrationReminderImageView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::Background[0] new fail!"); - return; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::VibrationReminderImageView is nullptr!"); + return false; } + imageconfig.y = 600; - Background[1] = SetUpImageVIew(imageconfig); - if (Background[1] == nullptr) + SilentModeImageView = SetUpImageVIew(imageconfig); + if (SilentModeImageView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::Background[1] new fail!"); - return; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::SilentModeImageView is nullptr!"); + return false; } - /* ------------------------- VibrationReminderLabel ------------------------- */ + + imageconfig = { + .x = 369, + .w = 14, + .h = 26, + .ImageSrc = "/user/res/SETTING_NEXT.bin", + }; + + for (int i = 0; i < 3; i++) + { + imageconfig.y = 157 + 120 * i; + nextImageView[i] = SetUpImageVIew(imageconfig); + if (nextImageView[i] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView:: nextImageView[%d] is nullptr!", i); + return false; + } + } + + return true; + } + + bool SoundAndVibrationView::InitSoundAndVibrationLabel(void) + { LabelConfig labelConfig = { .left = 90, - .top = 513, + .top = 140, .width = 120, .height = 35, .fontSize = 30, .lineHeigh = 35, - .text = "震动提醒", .lineBreakMode = UILabel::LINE_BREAK_ADAPT, }; + /* ---------------------------- SystemVolumeLabel --------------------------- */ + labelConfig.text = "系统音量"; + SystemVolumeLabel = SetUpLabel(labelConfig); + if (SystemVolumeLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::SystemVolumeLabel is nullptr!"); + return false; + } + /* ----------------------------- CallVolumeLabel ---------------------------- */ + labelConfig.top = 260; + labelConfig.text = "通话音量"; + CallVolumeLabel = SetUpLabel(labelConfig); + if (CallVolumeLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::CallVolumeLabel is nullptr!"); + return false; + } + /* ---------------------------- MediaVolumeLabel ---------------------------- */ + labelConfig.top = 380; + labelConfig.text = "媒体音量"; + MediaVolumeLabel = SetUpLabel(labelConfig); + if (MediaVolumeLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::MediaVolumeLabel is nullptr!"); + return false; + } + /* ------------------------- VibrationReminderLabel ------------------------- */ + labelConfig.top = 513; + labelConfig.text = "震动提醒"; VibrationReminderLabel = SetUpLabel(labelConfig); if (VibrationReminderLabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::VibrationReminderLabel is nullptr!"); - return; + return false; } /* ----------------------------- SilentModeLabel ---------------------------- */ labelConfig.top = 620; @@ -257,28 +357,57 @@ namespace OHOS if (SilentModeLabel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::SilentModeLabel is nullptr!"); - return; + return false; } - /* ---------------------------- SilentModeLabel_ ---------------------------- */ - labelConfig.top = 657; - labelConfig.text = "系统音量不受影响"; - labelConfig.fontSize = 20; - labelConfig.lineHeigh = 23; - SilentModeLabel_ = SetUpLabel(labelConfig); - if (SilentModeLabel_ == nullptr) + /* -------------------------------------------------------------------------- */ + typedef struct { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::SilentModeLabel_ is nullptr!"); - return; + int top; + char text[100]; + } LabelInfo; + + LabelInfo labelInfo[] = { + {177, "闹钟、提醒、查找手表"}, + {297, "手表通话"}, + {417, "音乐、录音、训练"}, + {657, "系统音量不受影响"}, + }; + for (int i = 0; i < sizeof(labelInfo) / sizeof(labelInfo[0]); i++) + { + LabelConfig labelConfig = { + .left = 90, + .top = labelInfo[i].top, + .width = 300, + .height = 35, + .fontSize = 20, + .lineHeigh = 23, + .text = labelInfo[i].text, + .lineBreakMode = UILabel::LINE_BREAK_ADAPT, + }; + + reminder[i] = SetUpLabel(labelConfig); + if (reminder[i] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::reminder[%d] is nullptr!", i); + return false; + } + + reminder[i]->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); + reminder[i]->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + reminder[i]->SetTextColor(Color::GetColorFromRGBA(0xfd, 0xfd, 0xfd, 0x7f)); } - SilentModeLabel_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); - SilentModeLabel_->SetStyle(STYLE_BACKGROUND_OPA, 0xff); - SilentModeLabel_->SetTextColor(Color::GetColorFromRGBA(0xfd, 0xfd, 0xfd, 0x7f)); + return true; + } + + bool SoundAndVibrationView::InitSoundAndVibrationToggleButton(void) + { + UIView::OnClickListener *ButtonClick = static_cast(SoundAndVibrationPresenter::GetInstance()); /* ---------------------- VibrationReminderToggleButton --------------------- */ VibrationReminderToggleButton = new UIToggleButton(); if (VibrationReminderToggleButton == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::VibrationReminderToggleButton new fail!"); - return; + return false; } VibrationReminderToggleButton->SetPosition(298, 505, 100, 50); VibrationReminderToggleButton->SetViewId(VIBRATION_REMINDER_TOGGLEBUTTON); @@ -293,7 +422,7 @@ namespace OHOS if (SilentModeToggleButton == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationView::SilentModeToggleButton new fail!"); - return; + return false; } SilentModeToggleButton->SetPosition(298, 625, 100, 50); SilentModeToggleButton->SetViewId(SILENT_MODEL_TOGGLEBUTTON); @@ -301,7 +430,35 @@ namespace OHOS SilentModeToggleButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); SilentModeToggleButton->SetImages(ToggleButtonSelect, ToggleButtonUnSelect); SilentModeToggleButton->SetOnClickListener(ButtonClick); + return true; + } + void SoundAndVibrationView::InitView(void) + { + if (InitSoundAndVibrationScrollView() == false) + { + return; + } + if (InitSoundAndVibrationViewTitleLabel() == false) + { + return; + } + if (InitSoundAndVibrationButtonView() == false) + { + return; + } + if (InitSoundAndVibrationImageView() == false) + { + return; + } + if (InitSoundAndVibrationToggleButton() == false) + { + return; + } + if (InitSoundAndVibrationLabel() == false) + { + return; + } initViewStatus = true; } @@ -318,11 +475,20 @@ namespace OHOS SoundAndVibrationScrollView->Add(SystemVolumeButton); SoundAndVibrationScrollView->Add(CallVolumeButton); SoundAndVibrationScrollView->Add(MediaVolumeButton); - SoundAndVibrationScrollView->Add(Background[0]); - SoundAndVibrationScrollView->Add(Background[1]); + SoundAndVibrationScrollView->Add(VibrationReminderImageView); + SoundAndVibrationScrollView->Add(SilentModeImageView); + SoundAndVibrationScrollView->Add(SystemVolumeLabel); + SoundAndVibrationScrollView->Add(CallVolumeLabel); + SoundAndVibrationScrollView->Add(MediaVolumeLabel); SoundAndVibrationScrollView->Add(VibrationReminderLabel); SoundAndVibrationScrollView->Add(SilentModeLabel); - SoundAndVibrationScrollView->Add(SilentModeLabel_); + SoundAndVibrationScrollView->Add(reminder[0]); + SoundAndVibrationScrollView->Add(reminder[1]); + SoundAndVibrationScrollView->Add(reminder[2]); + SoundAndVibrationScrollView->Add(reminder[3]); + SoundAndVibrationScrollView->Add(nextImageView[0]); + SoundAndVibrationScrollView->Add(nextImageView[1]); + SoundAndVibrationScrollView->Add(nextImageView[2]); SoundAndVibrationScrollView->Add(VibrationReminderToggleButton); SoundAndVibrationScrollView->Add(SilentModeToggleButton); RootView::GetInstance()->Add(SoundAndVibrationScrollView); diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingView.cpp index 4f65e773c..dc16bb2ef 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SoundAndVibrationVolumeSettingView.cpp @@ -1,4 +1,6 @@ #include "soundandvibration/include/SoundAndVibrationVolumeSettingView.h" +#include "soundandvibration/include/SoundAndVibrationPresenter.h" +#include "soundandvibration/include/SystemVolumePresenter.h" #include "wearable_log.h" namespace OHOS @@ -28,27 +30,34 @@ namespace OHOS { if (initViewStatus == true) { - group->RemoveAll(); + ScrollView->RemoveAll(); delete VolumeProcess; VolumeProcess = nullptr; delete VolumeVetor; VolumeVetor = nullptr; - delete group; - group = nullptr; + delete ScrollView; + ScrollView = nullptr; } } - UIViewGroup *SoundAndVibrationVolumeSettingView::SetUpVolumeProcess(void) + UIScrollView *SoundAndVibrationVolumeSettingView::SetUpVolumeProcess(void) { - group = new UIViewGroup(); - if (group == nullptr) + ScrollView = new UIScrollView(); + if (ScrollView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationVolumeSettingView::group new fail"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SoundAndVibrationVolumeSettingView::ScrollView new fail"); return nullptr; } - group->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); - group->SetDraggable(true); - group->SetTouchable(true); + ScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + UIView::OnDragListener *volumeDragListener = (UIView::OnDragListener *)OHOS::SystemVolumePresenter::GetInstance(); + if (volumeDragListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemVolumePresenter GetInstance fail"); + return nullptr; + } + ScrollView->SetOnDragListener(volumeDragListener); + ScrollView->SetDraggable(true); + ScrollView->SetTouchable(true); /* ------------------------------ VolumeProcess ----------------------------- */ VolumeProcess = new UISlider(); if (VolumeProcess == nullptr) @@ -92,15 +101,12 @@ namespace OHOS // progress->SetOnClickListener(listener); // progress->SetOnDragListener(listener); // progress->SetKnobStyle(StyleDefault::GetSliderKnobStyle()); - // UIView::OnDragListener *volDragListener = (UIView::OnDragListener *)OHOS::VolumeSliderEventListener::GetInstance(); + // // SetViewId(VOLUME_VIEW); - // SetOnDragListener(volDragListener); - // SetDraggable(true); - // SetTouchable(true); - group->Add(VolumeProcess); - group->Add(VolumeVetor); + ScrollView->Add(VolumeProcess); + ScrollView->Add(VolumeVetor); initViewStatus = true; - return group; + return ScrollView; } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SystemVolumeView.cpp b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SystemVolumeView.cpp index 0a94a4c1b..2ff1653f3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SystemVolumeView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/soundandvibration/src/SystemVolumeView.cpp @@ -27,7 +27,7 @@ namespace OHOS return g_pSystemVolumeView; } - UIViewGroup *SystemVolumeView::SystemVolumeViewInit(void) + UIScrollView *SystemVolumeView::SystemVolumeViewInit(void) { p_SoundAndVibrationVolumeSettingView = new SoundAndVibrationVolumeSettingView(); if (p_SoundAndVibrationVolumeSettingView == nullptr) @@ -35,14 +35,14 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemVolumeView::p_SoundAndVibrationVolumeSettingView is nullptr!"); return nullptr; } - group = p_SoundAndVibrationVolumeSettingView->SetUpVolumeProcess(); - if (group == nullptr) + SystemVolumeScrollView = p_SoundAndVibrationVolumeSettingView->SetUpVolumeProcess(); + if (SystemVolumeScrollView == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemVolumeView::group is nullptr!"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemVolumeView::SystemVolumeScrollView is nullptr!"); return nullptr; } - return group; + return SystemVolumeScrollView; } void SystemVolumeView::OnStart() @@ -54,7 +54,7 @@ namespace OHOS void SystemVolumeView::OnSetUpView() { View::OnSetUpView(); - RootView::GetInstance()->Add(group); + RootView::GetInstance()->Add(SystemVolumeScrollView); Draw(); } diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SoundAndVibration/CALL_VOLUME.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/SoundAndVibration/CALL_VOLUME.bin deleted file mode 100644 index cb2c53a0701ad761a000f18fbd57192b0697596c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25624 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 r*nO>{XsgPgAc?bwn>JtSj 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 q{O&ecwpJV1I5p3ayq5Ck%FKt=6vpu$u