From c6c0c4f1debf8724349d35aa340f0300e3d676bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BD=93=E5=BD=930?= Date: Thu, 10 Oct 2024 11:27:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B1=85?= =?UTF-8?q?=E5=B7=A6=E5=AF=B9=E9=BD=90=E5=AF=BC=E8=88=AA=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- entry/src/main/ets/common/Constants.ets | 14 +- .../main/ets/common/TabContentConstants.ets | 2 +- .../main/ets/entryability/EntryAbility.ets | 5 +- .../src/main/ets/pages/BackgroundLightTab.ets | 36 ++-- entry/src/main/ets/pages/BottomTab.ets | 28 +-- .../main/ets/pages/DoubleNestingTabOne.ets | 69 ++++--- .../main/ets/pages/DoubleNestingTabTwo.ets | 9 +- entry/src/main/ets/pages/DrawerTab.ets | 134 +++++++------- entry/src/main/ets/pages/Index.ets | 1 - entry/src/main/ets/pages/LeftTab.ets | 171 ++++++++++++++++++ entry/src/main/ets/pages/RudderStyleTab.ets | 35 ++-- entry/src/main/ets/pages/SideTab.ets | 25 ++- entry/src/main/ets/pages/SlideAndMoreTab.ets | 52 +++--- .../src/main/ets/pages/TabContentOverflow.ets | 2 +- entry/src/main/ets/pages/UnderlineTab.ets | 32 ++-- entry/src/main/ets/pages/WordTab.ets | 32 ++-- entry/src/main/ets/view/DiscoverPage.ets | 16 ++ entry/src/main/ets/view/VideoTabContent.ets | 13 +- entry/src/main/ets/viewmodel/TabViewModel.ets | 4 +- .../main/resources/base/element/float.json | 16 ++ .../main/resources/base/element/string.json | 16 ++ .../resources/base/profile/main_pages.json | 3 +- .../main/resources/en_US/element/string.json | 16 ++ .../main/resources/zh_CN/element/string.json | 16 ++ screenshots/device/leftTab.gif | Bin 0 -> 31639 bytes 26 files changed, 504 insertions(+), 254 deletions(-) create mode 100644 entry/src/main/ets/pages/LeftTab.ets create mode 100644 screenshots/device/leftTab.gif diff --git a/README.md b/README.md index ac53d51..ff6681f 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ | ![image](screenshots/device/bottom.gif) | ![image](screenshots/device/rudder.gif) | ![image](screenshots/device/tabcontent.gif) | ![image](screenshots/device/button.gif) | | 下划线样式 | 背景高亮样式 | 文字样式 | 双层嵌套样式 1 | | ![image](screenshots/device/underline.gif) | ![image](screenshots/device/highlight.gif) | ![image](screenshots/device/writing.gif) | ![image](screenshots/device/nesting1.gif) | -| 双层嵌套样式 2 | 常见侧边导航 | 抽屉式侧边导航 | -| ![image](screenshots/device/nesting2.gif) | ![image](screenshots/device/side.gif) | ![image](screenshots/device/drawers.gif) | +| 双层嵌套样式 2 | 常见侧边导航 | 抽屉式侧边导航 | 居左对齐样式 +| ![image](screenshots/device/nesting2.gif) | ![image](screenshots/device/side.gif) | ![image](screenshots/device/drawers.gif) |![image](screenshots/device/leftTab.gif) 使用说明: 1. 首页点击各个标签跳转到对应Tab页面。 2. 导航页点击Tab标签实现页面切换。 @@ -34,6 +34,7 @@ │ │ ├──DoubleNestingTabTwo.ets // 双层嵌套样式实现2 │ │ ├──DrawerTab.ets // 抽屉式导航 │ │ ├──Index.ets // 抽屉式侧边导航 +│ │ ├──LeftTab.ets // 居左对齐导航 │ │ ├──RudderStyleTab.ets // 舵式底部导航 │ │ ├──SideTab.ets // 常规侧边导航 │ │ ├──SlideAndMoreTab.ets // 可滑动+更多样式 @@ -71,8 +72,8 @@ 1.本示例仅支持标准系统上运行,支持设备:华为手机。 -2.HarmonyOS系统:HarmonyOS NEXT Developer Beta3及以上。 +2.HarmonyOS系统:HarmonyOS NEXT Developer Beta1及以上。 -3.DevEco Studio版本:DevEco Studio NEXT Developer Beta3及以上。 +3.DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。 -4.HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta3 SDK及以上。 \ No newline at end of file +4.HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。 \ No newline at end of file diff --git a/entry/src/main/ets/common/Constants.ets b/entry/src/main/ets/common/Constants.ets index ff96723..146d59f 100644 --- a/entry/src/main/ets/common/Constants.ets +++ b/entry/src/main/ets/common/Constants.ets @@ -269,6 +269,10 @@ export class Constants { { title: $r('app.string.top_nav'), child: [ + { + text: $r('app.string.left_tab'), + to: 'LeftTab' + }, { text: $r('app.string.underline_tab'), to: 'UnderlineTab' @@ -308,21 +312,21 @@ export class Constants { } ] } - ] + ]; } /** * Route type define. */ export interface Route { - title: string | Resource, - child: Array + title: string | Resource; + child: Array; } /** * ChildRoute type define. */ export interface ChildRoute { - text: string | Resource, - to: string + text: string | Resource; + to: string; } \ No newline at end of file diff --git a/entry/src/main/ets/common/TabContentConstants.ets b/entry/src/main/ets/common/TabContentConstants.ets index 571667b..db8d0b8 100644 --- a/entry/src/main/ets/common/TabContentConstants.ets +++ b/entry/src/main/ets/common/TabContentConstants.ets @@ -297,7 +297,7 @@ export class TabContentConstants { /** * Tab ber. */ - static readonly TAB_TABBAR: string = 'tabbar'; + static readonly TAB_TAB_BAR: string = 'tabBar'; /** * Tab playtime text. diff --git a/entry/src/main/ets/entryability/EntryAbility.ets b/entry/src/main/ets/entryability/EntryAbility.ets index 6dc4e21..fa536b7 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ets +++ b/entry/src/main/ets/entryability/EntryAbility.ets @@ -16,6 +16,7 @@ import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; +import { resourceManager } from '@kit.LocalizationKit'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { @@ -29,7 +30,9 @@ export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage: window.WindowStage): void { // Main window is created, set main page for this ability hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); - + let context = this.context; + let resourceManager: resourceManager.ResourceManager = context.resourceManager; + AppStorage.setOrCreate('resourceManager', resourceManager); windowStage.loadContent('pages/Index', (err, data) => { if (err.code) { hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); diff --git a/entry/src/main/ets/pages/BackgroundLightTab.ets b/entry/src/main/ets/pages/BackgroundLightTab.ets index 8a53621..c91dbf9 100644 --- a/entry/src/main/ets/pages/BackgroundLightTab.ets +++ b/entry/src/main/ets/pages/BackgroundLightTab.ets @@ -32,16 +32,16 @@ struct BackgroundLightTab { tabBuilder(tabName: string | Resource, tabIndex: number) { Row() { Text(tabName) - .fontSize($r('app.float.back_text_size')) - .fontColor(tabIndex === this.focusIndex ? Color.White : $r('app.color.text_color')) + .fontSize(14) + .fontColor(tabIndex === this.focusIndex ? Color.White : '#E6000000') .id(tabIndex.toString()) } .justifyContent(FlexAlign.Center) - .width(Constants.BACKGROUND_TAB_WIDTH) - .backgroundColor(tabIndex === this.focusIndex ? $r('app.color.checked_color') : $r('app.color.back_color')) - .borderRadius(Constants.BORDER_RADIUS_BACK_TAB) - .height(Constants.BACKGROUND_TAB_HEIGHT) - .margin({ left: $r('app.float.margin_eight'), right: $r('app.float.margin_eight') }) + .width(96) + .backgroundColor(tabIndex === this.focusIndex ? '#0A59F7' : '#0D000000') + .borderRadius(21) + .height(40) + .margin({ left: 8, right: 8 }) .onClick(() => { this.controller.changeIndex(tabIndex); this.listScroller.scrollToIndex(tabIndex, true, ScrollAlign.CENTER); @@ -52,36 +52,36 @@ struct BackgroundLightTab { Column() { Row() { List({ scroller: this.listScroller }) { - ForEach(this.tabArray.slice(Constants.SLICE_INDEX_ZERO, Constants.SLICE_INDEX_SIX), + ForEach(this.tabArray.slice(0, 6), (item: TabItem, index: number) => { this.tabBuilder(item.name, index); }, (item: TabItem, index: number) => JSON.stringify(item) + index) } - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) + .width('100%') + .height('100%') .listDirection(Axis.Horizontal) .scrollBar(BarState.Off) } .alignItems(VerticalAlign.Center) - .height($r('app.float.mainPage_barHeight')) - .margin({ top: $r('app.float.margin_eight') }) + .height(52) + .margin({ top: 8 }) Tabs({ barPosition: BarPosition.Start, controller: this.controller }) { - ForEach(this.tabArray.slice(Constants.SLICE_INDEX_ZERO, Constants.SLICE_INDEX_SIX), + ForEach(this.tabArray.slice(0, 6), (item: TabItem) => { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) } .backgroundColor(Color.White) }, (item: TabItem, index: number) => JSON.stringify(item) + index) } - .width(Constants.FULL_WIDTH) + .width('100%') .barHeight(this.barHeight) .animationDuration(Constants.ANIMATION_DURATION) .onAnimationStart((index: number, targetIndex: number) => { @@ -90,6 +90,6 @@ struct BackgroundLightTab { this.listScroller.scrollToIndex(targetIndex, true, ScrollAlign.CENTER); }) } - .height(Constants.FULL_HEIGHT) + .height('100%') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/BottomTab.ets b/entry/src/main/ets/pages/BottomTab.ets index 0b54f07..b15da51 100644 --- a/entry/src/main/ets/pages/BottomTab.ets +++ b/entry/src/main/ets/pages/BottomTab.ets @@ -26,17 +26,17 @@ struct BottomTab { tabBuilder(title: Resource, index: number, selectedImg: Resource, normalImg: Resource) { Column() { Image(this.currentIndex === index ? selectedImg : normalImg) - .width($r('app.float.mainPage_baseTab_size')) - .height($r('app.float.mainPage_baseTab_size')) + .width(24) + .height(24) .objectFit(ImageFit.Contain) Text(title) - .margin({ top: $r('app.float.mainPage_baseTab_top') }) - .fontSize($r('app.float.tab_text_font_size')) - .fontColor(this.currentIndex === index ? $r('app.color.current_color') : $r('app.color.text_color')) + .margin({ top: 4 }) + .fontSize(10) + .fontColor(this.currentIndex === index ? '#3388ff' : '#E6000000') } .justifyContent(FlexAlign.Center) - .height($r('app.float.mainPage_barHeight')) - .width(Constants.FULL_WIDTH) + .height(52) + .width('100%') .onClick(() => { this.currentIndex = index; this.tabsController.changeIndex(this.currentIndex); @@ -48,13 +48,13 @@ struct BottomTab { TabContent() { Row() { Text(text) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) } - .padding({ left: $r('app.float.padding_bottom_tab'), right: $r('app.float.padding_bottom_tab') }) + .padding({ left: 12, right: 12 }) .backgroundColor(Color.White) .tabBar(this.tabBuilder(text, index, selectedImg, normalImg)) } @@ -71,9 +71,9 @@ struct BottomTab { this.tabContentBuilder($r('app.string.activity'), Constants.TAB_INDEX_TWO, $r('app.media.activeStar'), $r('app.media.star')) } - .width(Constants.FULL_WIDTH) - .backgroundColor($r('app.color.tab_color')) - .barHeight($r('app.float.mainPage_barHeight')) + .width('100%') + .backgroundColor('#F3F4F5') + .barHeight(52) .barMode(BarMode.Fixed) .onAnimationStart((index: number, targetIndex: number) => { hilog.info(0x0000, 'index', index.toString()); diff --git a/entry/src/main/ets/pages/DoubleNestingTabOne.ets b/entry/src/main/ets/pages/DoubleNestingTabOne.ets index 3bd7cac..b62c5ff 100644 --- a/entry/src/main/ets/pages/DoubleNestingTabOne.ets +++ b/entry/src/main/ets/pages/DoubleNestingTabOne.ets @@ -35,25 +35,24 @@ struct DoubleNestingTabOne { tabBuilder(index: number, name: string | Resource) { Column() { Text(name) - .fontColor($r('app.color.text_color')) - .fontSize(this.currentIndex === index ? - $r('app.float.current_text_size') : $r('app.float.double_text_size')) - .fontWeight(this.currentIndex === index ? Constants.FONT_WEIGHT_TAB : FontWeight.Normal) + .fontColor('#E6000000') + .fontSize(this.currentIndex === index ? 20 : 18) + .fontWeight(this.currentIndex === index ? 600 : FontWeight.Normal) } - .width(Constants.FULL_WIDTH) + .width('100%') } @Builder subTabBuilder(tabName: string | Resource, tabIndex: number) { Row() { Text(tabName) - .fontSize($r('app.float.text_size')) - .fontColor(tabIndex === this.focusIndex ? $r('app.color.checked_color') : $r('app.color.text_color')) + .fontSize(16) + .fontColor(tabIndex === this.focusIndex ? '#0A59F7' : '#E6000000') .id(tabIndex.toString()) } .justifyContent(FlexAlign.Center) - .padding({ left: Constants.TAB_PADDING, right: Constants.TAB_PADDING }) - .height(Constants.SUB_TAB_HEIGHT) + .padding({ left: 12, right: 12 }) + .height(30) .onClick(() => { this.subController.changeIndex(tabIndex); this.focusIndex = tabIndex; @@ -66,14 +65,14 @@ struct DoubleNestingTabOne { Column() { Row() { Text(text) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) + .width('100%') + .height('100%') .justifyContent(FlexAlign.Center) } - .width(Constants.FULL_WIDTH) + .width('100%') } .tabBar(this.tabBuilder(index, text)) } @@ -91,22 +90,22 @@ struct DoubleNestingTabOne { }, (item: TabItem, index: number) => JSON.stringify(item) + index) } .listDirection(Axis.Horizontal) - .height(Constants.SUB_TAB_HEIGHT) + .height(30) .scrollBar(BarState.Off) - .width(Constants.SUB_LIST_WIDTH) - .friction($r('app.float.list_friction')) + .width('85%') + .friction(0.6) Image($r('app.media.more')) - .width(Constants.MORE_IMAGE_WIDTH) - .height(Constants.MORE_IMAGE_HEIGHT) - .margin({ left: $r('app.float.margin_sixteen') }) + .width(20) + .height(15) + .margin({ left: 16 }) } - .height(Constants.SUB_TAB_BOT_HEIGHT) - .width(Constants.FULL_WIDTH) + .height(25) + .width('100%') } .alignItems(HorizontalAlign.Center) - .width(Constants.FULL_WIDTH) - .padding({ left: $r('app.float.padding_double_tab_left') }) + .width('100%') + .padding({ left: 4 }) Tabs({ barPosition: BarPosition.Start, controller: this.subController }) { ForEach(this.tabArray, (item: TabItem) => { @@ -114,10 +113,10 @@ struct DoubleNestingTabOne { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) .gesture( PanGesture(this.panOptionRight) @@ -131,10 +130,10 @@ struct DoubleNestingTabOne { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) } .backgroundColor(Color.White) @@ -158,16 +157,16 @@ struct DoubleNestingTabOne { } .vertical(false) .barMode(BarMode.Fixed) - .barWidth(Constants.FULL_WIDTH) - .barHeight($r('app.float.mainPage_barHeight')) + .barWidth('100%') + .barHeight(52) .animationDuration(Constants.ANIMATION_DURATION) .onAnimationStart((index: number, targetIndex: number) => { hilog.info(0x0000, 'index', index.toString()); this.currentIndex = targetIndex; }) - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) + .width('100%') + .height('100%') } - .width(Constants.FULL_WIDTH) + .width('100%') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/DoubleNestingTabTwo.ets b/entry/src/main/ets/pages/DoubleNestingTabTwo.ets index 5b45701..f0e8071 100644 --- a/entry/src/main/ets/pages/DoubleNestingTabTwo.ets +++ b/entry/src/main/ets/pages/DoubleNestingTabTwo.ets @@ -12,8 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Constants } from '../common/Constants'; -import { DiscoverPage } from '../view/DiscoverPage' +import { DiscoverPage } from '../view/DiscoverPage'; + @Entry @Component struct DoubleNestingTabOne { @@ -26,8 +28,7 @@ struct DoubleNestingTabOne { Column() { Text(name) .fontColor($r('app.color.text_color')) - .fontSize(this.currentIndex === index ? - $r('app.float.current_text_size') : $r('app.float.double_text_size')) + .fontSize(this.currentIndex === index ? $r('app.float.current_text_size') : $r('app.float.double_text_size')) .fontWeight(this.currentIndex === index ? Constants.FONT_WEIGHT_TAB : FontWeight.Normal) } .width(Constants.FULL_WIDTH) @@ -67,7 +68,7 @@ struct DoubleNestingTabOne { .barWidth(Constants.FULL_WIDTH) .barHeight($r('app.float.mainPage_barHeight')) .animationDuration(Constants.ANIMATION_DURATION) - .onAnimationStart((index: number, targetIndex: number) => { + .onAnimationStart((_index: number, targetIndex: number) => { this.currentIndex = targetIndex; }) .width(Constants.FULL_WIDTH) diff --git a/entry/src/main/ets/pages/DrawerTab.ets b/entry/src/main/ets/pages/DrawerTab.ets index 72a270e..083e1df 100644 --- a/entry/src/main/ets/pages/DrawerTab.ets +++ b/entry/src/main/ets/pages/DrawerTab.ets @@ -17,7 +17,7 @@ import { Constants } from '../common/Constants'; @Entry @Component -struct SideTab { +struct DrawerTab { @State navList: Array = [0, 1, 2, 3, 4, 5]; @State active: number = 0; @State show: boolean = false; @@ -25,69 +25,67 @@ struct SideTab { build() { SideBarContainer(SideBarContainerType.Overlay) { Column() { - Column() { - ForEach(this.navList, (item: number, index: number) => { - Column() { - Row() { - Image(this.active === item ? $r('app.media.activeList') : $r("app.media.list")) - .width(Constants.DRAWER_IMAGE_HEIGHT_WIDTH) - .height(Constants.DRAWER_IMAGE_HEIGHT_WIDTH) - Text($r('app.string.list_name')) - .fontSize($r('app.float.text_size')) - .fontColor(Color.Black) - .fontWeight(FontWeight.Medium) - .margin({ left: $r('app.float.margin_list') }) - } - .height(Constants.LIST_HEIGHT) - .width(Constants.FULL_WIDTH) - - if (this.navList.length - 1 !== index) { - Row() - .height(Constants.DIVIDER_HEIGHT) - .backgroundColor($r('app.color.index_divider_color')) - .width(Constants.DIVIDER_DRAWER_WIDTH) - } + ForEach(this.navList, (item: number, index: number) => { + Column() { + Row() { + Image(this.active === item ? $r('app.media.activeList') : $r('app.media.list')) + .width(24) + .height(24) + Text($r('app.string.list_name')) + .fontSize(16) + .fontColor(Color.Black) + .fontWeight(FontWeight.Medium) + .margin({ left: 17 }) } - .onClick(() => { - this.active = item; - }) - .margin({ - top: $r('app.float.margin_drawer_list'), - left: $r('app.float.margin_drawer_list'), - right: $r('app.float.margin_drawer_list'), - bottom: $r('app.float.margin_drawer_list') - }) - .justifyContent(FlexAlign.Center) - .width(Constants.DRAWER_WIDTH) - .height(Constants.LIST_HEIGHT) - .padding({ left: $r('app.float.padding_drawer_row')}) - .borderRadius(Constants.BORDER_RADIUS_DRAWER) - .backgroundColor(this.active === item ? $r('app.color.current_list_color') : '') - }, (item: number, index: number) => JSON.stringify(item) + index) + .height(48) + .width('100%') - Row() { - Image($r('app.media.add')) - .width(Constants.LIST_IMAGE_HEIGHT_WIDTH) - .height(Constants.LIST_IMAGE_HEIGHT_WIDTH) - Text($r('app.string.add_list')).margin({ left: $r('app.float.margin_eight') }) + if (this.navList.length - 1 !== index) { + Row() + .height(0.5) + .backgroundColor('#0D000000') + .width('90%') + } } - .width(Constants.FULL_WIDTH) - .margin({ top: $r('app.float.margin_sidebar_content') }) + .onClick(() => { + this.active = item; + }) + .margin({ + top: 4, + left: 4, + right: 4, + bottom: 4 + }) + .justifyContent(FlexAlign.Center) + .width(264) + .height(48) + .padding({ left: 13 }) + .borderRadius(16) + .backgroundColor(this.active === item ? '#1A0A59F7' : '') + }, (item: number, index: number) => JSON.stringify(item) + index) + + Row() { + Image($r('app.media.add')) + .width(40) + .height(40) + Text($r('app.string.add_list')).margin({ left: 8 }) } - .width(Constants.LIST_CARD_WIDTH) - .height(Constants.LIST_CARD_HEIGHT) - .backgroundColor(Color.White) - .borderRadius(Constants.BORDER_RADIUS_DRAWER_CONTENT) + .width('100%') + .margin({ top: 284 }) } - .height(Constants.FULL_HEIGHT) - .padding({ top: $r('app.float.drawer_padding') }) - .backgroundColor($r('app.color.list_background_color')) + .width(272) + .height(344) + .backgroundColor(Color.White) + .borderRadius(20) + .height('100%') + .padding({ top: 104 }) + .backgroundColor('#E9EAEC') Column() { Text($r('app.string.content')) - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .width('100%') + .height('100%') + .fontSize(30) .textAlign(TextAlign.Center) .fontColor(Color.Black) } @@ -100,16 +98,16 @@ struct SideTab { this.show = false; }) }) - .width(Constants.FULL_WIDTH) - .height(Constants.LIST_CONTENT_HEIGHT) - .backgroundColor(this.show ? $r('app.color.content_background_color') : '') + .width('100%') + .height('110%') + .backgroundColor(this.show ? '#c1c2c4' : '') } .showSideBar(this.show) .controlButton({ - left: Constants.MARGIN_SIXTEEN, - top: Constants.MARGIN_BUTTON_TOP, - height: Constants.LIST_IMAGE_HEIGHT_WIDTH, - width: Constants.LIST_IMAGE_HEIGHT_WIDTH, + left: 16, + top: 48, + height: 40, + width: 40, icons: { shown: $r('app.media.changeBack'), hidden: $r('app.media.change'), @@ -119,10 +117,10 @@ struct SideTab { .onChange((value: boolean) => { this.show = value; }) - .sideBarWidth(Constants.SUB_LIST_WIDTH) - .minSideBarWidth(Constants.SUB_LIST_WIDTH) - .width(Constants.FULL_WIDTH) - .height(Constants.LIST_CONTENT_HEIGHT) - .translate({ y: Constants.TRANSLATE_TOP }) + .sideBarWidth('85%') + .minSideBarWidth('85%') + .width('100%') + .height('110%') + .translate({ y: -40 }) } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index d5c7e97..1ab7d4d 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -20,7 +20,6 @@ import { Constants, Route, ChildRoute } from '../common/Constants'; @Component struct Index { private routes: Route[] = Constants.ROUTES; - private one: number = 1; build() { Column() { diff --git a/entry/src/main/ets/pages/LeftTab.ets b/entry/src/main/ets/pages/LeftTab.ets new file mode 100644 index 0000000..2b59470 --- /dev/null +++ b/entry/src/main/ets/pages/LeftTab.ets @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { componentUtils } from '@kit.ArkUI'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { resourceManager } from '@kit.LocalizationKit'; + +@Entry +@Component +struct LeftTab { + @State tabArray: Array = [0, 1, 2]; + @State currentIndex: number = 0; + @State indicatorLeftMargin: number = 0; + @State indicatorWidth: number = 0; + @State tabsWidth: number = 0; + private controller: TabsController = new TabsController(); + private tabLeftOffset: number = 0; + private animationDuration: number = 300; + private resource: resourceManager.ResourceManager | undefined = AppStorage.get('resourceManager'); + private tabStr: string = this.resource?.getStringSync($r('app.string.tab')?.id) ?? '页签'; + private pageStr: string = this.resource?.getStringSync($r('app.string.page')?.id) ?? '这是页面'; + private contentStr: string = this.resource?.getStringSync($r('app.string.page_content')?.id) ?? '的内容'; + + @Builder + tab(tabName: string, _tabItem: number, tabIndex: number) { + Row() { + Text(tabName) + .fontSize(16) + .lineHeight(22) + .fontColor(tabIndex === this.currentIndex ? '#0A59F7' : '#E6000000') + .id(tabIndex.toString()) + .onAreaChange((_, newValue: Area) => { + if (this.currentIndex === tabIndex && (this.indicatorLeftMargin === 0 || this.indicatorWidth === 0)) { + let positionX: number; + let width: number = Number.parseFloat(newValue.width.toString()); + if (newValue.position.x !== undefined) { + positionX = Number.parseFloat(newValue.position.x?.toString()) + this.indicatorLeftMargin = Number.isNaN(positionX) ? 0 : positionX; + } + this.indicatorWidth = width; + } + }) + } + .justifyContent(FlexAlign.Center) + .constraintSize({ minWidth: 35 }) + .width(64) + .height(35) + .onClick(() => { + this.controller.changeIndex(tabIndex); + this.currentIndex = tabIndex; + }) + } + + build() { + Column() { + Stack({ alignContent: Alignment.TopStart }) { + // The text of tab. + Row() { + ForEach(this.tabArray, (item: number, index: number) => { + this.tab(this.tabStr + item, item, index); + }, (item: number, _index: number) => item.toString()) + Blank() + Text('+') + .width(24) + .height(24) + .fontSize(24) + .textAlign(TextAlign.Center) + .margin({ right: 24 }) + } + .justifyContent(FlexAlign.Start) + .width('100%') + + // The underline of tab. + Column() + .width(this.indicatorWidth) + .height(1.5) + .backgroundColor('#0A59F7') + .borderRadius(1) + .margin({ left: this.indicatorLeftMargin, top: 35 }) + + } + .height(56) + .margin({ left: this.tabLeftOffset }) + + Tabs({ controller: this.controller }) { + ForEach(this.tabArray, (item: number) => { + TabContent() { + Row() { + Text(this.pageStr + ' ' + item + ' ' + this.contentStr); + } + .justifyContent(FlexAlign.Center) + .width('100%') + } + }, (item: number, _index: number) => item.toString()) + } + .onAreaChange((_, newValue: Area) => { + this.tabsWidth = Number.parseFloat(newValue.width.toString()); + }) + .barWidth('100%') + .barHeight(0) + .width('100%') + .height('100%') + .animationDuration(this.animationDuration) + // swipe by touch. + .onGestureSwipe((index: number, event: TabsAnimationEvent) => { + let currentIndicator = this.getCurrentIndicatorInfo(index, event); + this.currentIndex = currentIndicator.index; + this.indicatorLeftMargin = currentIndicator.left; + this.indicatorWidth = currentIndicator.width; + }) + // swipe by click tab. + .onAnimationStart((_index: number, targetIndex: number, _event: TabsAnimationEvent) => { + this.currentIndex = targetIndex; + let targetIndexInfo = this.getTextInfo(targetIndex); + this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width); + }) + } + .height('100%') + } + + private getCurrentIndicatorInfo(index: number, event: TabsAnimationEvent): Record { + let nextIndex = index; + if (index > 0 && event.currentOffset > 0) { + // swipe to left. + nextIndex--; + } else if (index < this.tabArray.length && event.currentOffset > 0) { + // swipe to right. + nextIndex++; + } else { + // error condition. + hilog.info(0x0000, 'leftTab', 'the index is out of boundary: %{public}s', index); + } + let indexInfo = this.getTextInfo(index); + let nextIndexInfo = this.getTextInfo(index); + + let swipeRatio = Math.abs(event.currentOffset / this.tabsWidth); + let currentIndex = swipeRatio > 0.5 ? nextIndex : index; + let currentIndicatorLeft: number = indexInfo.left + (nextIndexInfo.left - indexInfo.left) * swipeRatio; + let currentIndicatorWidth: number = indexInfo.width + (nextIndexInfo.width - indexInfo.width) * swipeRatio; + return { 'index': currentIndex, 'left': currentIndicatorLeft, 'width': currentIndicatorWidth }; + } + + private getTextInfo(index: number): Record { + let modePosition: componentUtils.ComponentInfo = componentUtils.getRectangleById(index.toString()); + return { 'left': px2vp(modePosition.windowOffset.x), 'width': px2vp(modePosition.size.width) }; + } + + private startAnimateTo(duration: number, leftMargin: number, width: number) { + animateTo({ + duration: duration, + curve: Curve.Linear, + iterations: 1, + playMode: PlayMode.Normal, + }, () => { + this.indicatorLeftMargin = leftMargin; + this.indicatorWidth = width; + }) + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/RudderStyleTab.ets b/entry/src/main/ets/pages/RudderStyleTab.ets index 3bbed5a..0559f2d 100644 --- a/entry/src/main/ets/pages/RudderStyleTab.ets +++ b/entry/src/main/ets/pages/RudderStyleTab.ets @@ -19,7 +19,7 @@ import { Constants } from '../common/Constants'; @Entry @Component -struct OstrichStyleTab { +struct RudderStyleTab { @State tabArray: Array = initTabTuData(); @State currentIndex: number = 0; @State iconOffset: number = 0; @@ -31,11 +31,11 @@ struct OstrichStyleTab { Column() { if (index === Constants.TAB_INDEX_TWO) { Image(defaultImage) - .size({ width: Constants.IMAGE_SIZE_MIDDLE, height: Constants.IMAGE_SIZE_MIDDLE }) - .offset({ y: Constants.IMAGE_OFFSET }) + .size({ width: 56, height: 56 }) + .offset({ y: -15 }) } else { Image(this.currentIndex === index ? selectImage : defaultImage) - .size({ width: Constants.IMAGE_SIZE_TAB, height: Constants.IMAGE_SIZE_TAB }) + .size({ width: 22, height: 22 }) .offset({ y: (this.currentIndex === index && this.currentIndex !== Constants.TAB_INDEX_TWO) ? this.iconOffset : this.initNumber @@ -50,16 +50,16 @@ struct OstrichStyleTab { if (!middleMode) { Text(title) - .fontSize($r('app.float.tab_text_font_size')) - .margin({ top: $r('app.float.margin_tab_text') }) - .fontColor(this.currentIndex === index ? $r('app.color.current_color') : $r('app.color.text_color')) + .fontSize(10) + .margin({ top: 6 }) + .fontColor(this.currentIndex === index ? '#3388ff' : '#E6000000') } } - .padding({ top: $r('app.float.padding_rudder_tab') }) - .width(Constants.FULL_WIDTH) - .backgroundColor($r('app.color.tab_color')) - .height($r('app.float.rudder_barHeight')) - .translate({ y: Constants.TRANSLATE_BOTTOM }) + .padding({ top: 11 }) + .width('100%') + .backgroundColor('#F3F4F5') + .height(90) + .translate({ y: 40 }) .onClick(() => { if (index !== Constants.TAB_INDEX_TWO) { this.currentIndex = index; @@ -75,17 +75,16 @@ struct OstrichStyleTab { Tabs({ barPosition: BarPosition.End, controller: this.controller }) { ForEach(this.tabArray, (item: BottomTabModel, index: number) => { if (index === Constants.TAB_INDEX_TWO) { - TabContent() { - } + TabContent() .backgroundColor(Color.White) } else { TabContent() { Row() { Text(item.title) - .fontSize($r('app.float.content_font_size')) + .fontSize(30) } - .height(Constants.CONTENT_HEIGHT) - .width(Constants.FULL_WIDTH) + .height(300) + .width('100%') .justifyContent(FlexAlign.Center) } .backgroundColor(Color.White) @@ -103,6 +102,6 @@ struct OstrichStyleTab { } } } - .height(Constants.FULL_HEIGHT) + .height('100%') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/SideTab.ets b/entry/src/main/ets/pages/SideTab.ets index 6b3c501..013f7db 100644 --- a/entry/src/main/ets/pages/SideTab.ets +++ b/entry/src/main/ets/pages/SideTab.ets @@ -15,7 +15,6 @@ import { initSideData } from '../viewmodel/TabViewModel'; import { ClassifyModel } from '../viewmodel/TabItem'; -import { Constants } from '../common/Constants'; @Component struct ClassifyItem { @@ -27,20 +26,20 @@ struct ClassifyItem { build() { Text(this.classifyName) .fontSize(14) - .fontColor(this.isSelected ? $r('app.color.side_selected_color') : $r('app.color.side_text_color')) + .fontColor(this.isSelected ? '#182431' : '#99182431') .fontFamily(this.isSelected ? $r('app.string.hei_ti_medium') : $r('app.string.hei_ti')) .fontWeight(this.isSelected ? FontWeight.Medium : FontWeight.Normal) .textAlign(TextAlign.Center) - .backgroundColor(this.isSelected ? $r('app.color.side_content_color') : '') - .width(Constants.FULL_WIDTH) - .height($r('app.float.mainPage_barHeight')) + .backgroundColor(this.isSelected ? '#FFFFFF' : '') + .width('100%') + .height(52) .onClick(this.onClickAction) } } @Entry @Component -struct IndexPage { +struct SideTab { @State currentClassify: number = 0; @State ClassifyArray: Array = initSideData(); private classifyScroller: Scroller = new Scroller(); @@ -74,20 +73,20 @@ struct IndexPage { } }, (item: ClassifyModel, index: number) => JSON.stringify(item) + index) } - .height(Constants.LIST_CONTENT_HEIGHT) - .width(Constants.SIDE_TAB_WIDTH) - .backgroundColor($r('app.color.side_background_color')) + .height('110%') + .width('27.8%') + .backgroundColor('#F1F3F5') .scrollBar(BarState.Off) - .margin({ top: $r('app.float.margin_side_tab_top') }) + .margin({ top: 74 }) Column() { ForEach(this.ClassifyArray, (item: ClassifyModel, index: number) => { Text(this.currentClassify === index ? item.classifyName : '') - .fontSize($r('app.float.content_font_size')) + .fontSize(30) },(item: ClassifyModel, index: number) => JSON.stringify(item) + index) } - .width(Constants.SIDE_CONTEND_WIDTH) + .width('72.2%') } - .backgroundColor($r('app.color.side_content_color')) + .backgroundColor('#FFFFFF') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/SlideAndMoreTab.ets b/entry/src/main/ets/pages/SlideAndMoreTab.ets index 76ef5b4..5d1cac3 100644 --- a/entry/src/main/ets/pages/SlideAndMoreTab.ets +++ b/entry/src/main/ets/pages/SlideAndMoreTab.ets @@ -21,7 +21,7 @@ import { Constants } from '../common/Constants'; @Entry @Component -struct SlideAndMore { +struct SlideAndMoreTab { @State tabArray: Array = initTabData(); @State focusIndex: number = 0; @State pre: number = 0; @@ -40,14 +40,13 @@ struct SlideAndMore { Tab(tabName: string | Resource, tabIndex: number) { Row() { Text(tabName) - .fontSize($r('app.float.size_text')) - .fontColor(tabIndex === this.focusIndex ? $r('app.color.checked_color') : $r('app.color.text_color')) + .fontSize(16) + .fontColor(tabIndex === this.focusIndex ? '#0A59F7' : '#E6000000') .id(tabIndex.toString()) .onAreaChange((oldValue: Area, newValue: Area) => { - hilog.info(0x0000, 'index', oldValue.toString()); if (this.focusIndex === tabIndex && (this.indicatorLeftMargin === 0 || this.indicatorWidth === 0)) { - if (newValue.position.x != undefined) { + if (newValue.position.x !== undefined) { let positionX = Number.parseFloat(newValue.position.x.toString()); this.indicatorLeftMargin = Number.isNaN(positionX) ? 0 : positionX; } @@ -57,9 +56,9 @@ struct SlideAndMore { } }) } - .padding({ left: Constants.TAB_PADDING, right: Constants.TAB_PADDING }) + .padding({ left: 12, right: 12 }) .justifyContent(FlexAlign.Center) - .height(Constants.SUB_TAB_HEIGHT) + .height(30) .onClick(() => { this.controller.changeIndex(tabIndex); this.focusIndex = tabIndex; @@ -77,53 +76,52 @@ struct SlideAndMore { }, (item: TabItem, index: number) => JSON.stringify(item) + index) } .listDirection(Axis.Horizontal) - .height(Constants.SUB_TAB_HEIGHT) + .height(30) .scrollBar(BarState.Off) - .width(Constants.SUB_LIST_WIDTH) - .friction($r('app.float.list_friction')) + .width('85%') + .friction(0.6) .onWillScroll((xOffset: number) => { this.indicatorLeftMargin -= xOffset; }) Image($r('app.media.more')) - .width(Constants.MORE_IMAGE_WIDTH) - .height(Constants.MORE_IMAGE_HEIGHT) - .margin({ left: Constants.MARGIN_SIXTEEN }) + .width(20) + .height(15) + .margin({ left: 16 }) } - .height($r('app.float.mainPage_barHeight')) - .width(Constants.FULL_WIDTH) + .height(52) + .width('100%') } .alignItems(HorizontalAlign.Center) - .width(Constants.FULL_WIDTH) + .width('100%') Column() - .height(Constants.STROKE_WIDTH) + .height(2) .width(this.indicatorWidth) - .margin({ left: this.indicatorLeftMargin, top: $r('app.float.margin_slide_top') }) - .backgroundColor($r('app.color.checked_color')) + .margin({ left: this.indicatorLeftMargin, top: 40 }) + .backgroundColor('#0A59F7') } - .width(Constants.FULL_WIDTH) + .width('100%') Tabs({ barPosition: BarPosition.Start, controller: this.controller }) { ForEach(this.tabArray, (item: TabItem) => { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) } .backgroundColor(Color.White) }, (item: TabItem, index: number) => JSON.stringify(item) + index) } - .onAreaChange((oldValue: Area, newValue: Area) => { - hilog.info(0x0000, 'index', oldValue.toString()); + .onAreaChange((_oldValue: Area, newValue: Area) => { let width = Number.parseFloat(newValue.width.toString()); this.tabsWidth = Number.isNaN(width) ? 0 : width; }) - .width(Constants.FULL_WIDTH) + .width('100%') .barHeight(0) .animationDuration(Constants.ANIMATION_DURATION) .onAnimationStart((index: number, targetIndex: number) => { @@ -145,7 +143,7 @@ struct SlideAndMore { this.indicatorWidth = currentIndicatorInfo.width; }) } - .height(Constants.FULL_HEIGHT) + .height('100%') } // Gets component size, position, translation, scaling rotation, and affine matrix attribute information. diff --git a/entry/src/main/ets/pages/TabContentOverflow.ets b/entry/src/main/ets/pages/TabContentOverflow.ets index d7ada03..fba61b2 100644 --- a/entry/src/main/ets/pages/TabContentOverflow.ets +++ b/entry/src/main/ets/pages/TabContentOverflow.ets @@ -95,7 +95,7 @@ struct TabContentOverFlow { .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]) .backgroundColor($r('app.color.tab_row_background')) .justifyContent(FlexAlign.SpaceAround) - .id(TabContentConstants.TAB_TABBAR) + .id(TabContentConstants.TAB_TAB_BAR) .alignRules({ top: { anchor: TabContentConstants.TAB_CONTAINER, align: VerticalAlign.Bottom }, left: { anchor: TabContentConstants.TAB_CONTAINER, align: HorizontalAlign.Start } diff --git a/entry/src/main/ets/pages/UnderlineTab.ets b/entry/src/main/ets/pages/UnderlineTab.ets index e116f2d..6a99d84 100644 --- a/entry/src/main/ets/pages/UnderlineTab.ets +++ b/entry/src/main/ets/pages/UnderlineTab.ets @@ -28,16 +28,16 @@ struct UnderlineTab { tabBuilder(index: number, name: string | Resource) { Column() { Text(name) - .fontColor(this.currentIndex === index ? $r('app.color.checked_color') : $r('app.color.text_color')) - .fontSize($r('app.float.text_size')) + .fontColor(this.currentIndex === index ? '#0A59F7' : '#E6000000') + .fontSize(16) .fontWeight(this.currentIndex === index ? FontWeight.Normal : FontWeight.Medium) - .lineHeight($r('app.float.text_line_height')) - .margin({ top: $r('app.float.margin_list'), bottom: $r('app.float.margin_under_tab') }) + .lineHeight(22) + .margin({ top: 17, bottom: 7 }) Divider() - .width($r('app.float.divider_width')) + .width(48) .strokeWidth(Constants.STROKE_WIDTH) - .color($r('app.color.checked_color')) - .opacity(this.currentIndex === index ? $r('app.float.opacity_1') : $r('app.float.opacity_0')) + .color('#0A59F7') + .opacity(this.currentIndex === index ? 1 : 0) } } @@ -48,26 +48,26 @@ struct UnderlineTab { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) - .height(Constants.FULL_HEIGHT) + .height('100%') }.tabBar(this.tabBuilder(item.id, item.name)) }, (item: TabItem, index: number) => JSON.stringify(item) + index) } .vertical(false) .barMode(BarMode.Fixed) - .barWidth(Constants.FULL_WIDTH) - .barHeight($r('app.float.mainPage_barHeight')) + .barWidth('100%') + .barHeight(52) .animationDuration(Constants.ANIMATION_DURATION) .onAnimationStart((index: number, targetIndex: number) => { hilog.info(0x0000, 'index', index.toString()); this.currentIndex = targetIndex; }) - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) - }.width(Constants.FULL_WIDTH) + .width('100%') + .height('100%') + }.width('100%') } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/WordTab.ets b/entry/src/main/ets/pages/WordTab.ets index c766958..46206cc 100644 --- a/entry/src/main/ets/pages/WordTab.ets +++ b/entry/src/main/ets/pages/WordTab.ets @@ -26,35 +26,33 @@ struct WordTab { @Builder tabBuilder(index: number, name: string | Resource) { - Column() { - Text(name) - .fontColor(Color.Black) - .fontSize(this.currentIndex === index ? $r('app.float.current_text_size') : $r('app.float.text_size')) - .fontWeight(this.currentIndex === index ? Constants.FONT_WEIGHT_TAB : FontWeight.Normal) - .lineHeight($r('app.float.text_line_height')) - .id(index.toString()) - } + Text(name) + .fontColor(Color.Black) + .fontSize(this.currentIndex === index ? 20 : 16) + .fontWeight(this.currentIndex === index ? 600 : FontWeight.Normal) + .lineHeight(22) + .id(index.toString()) } build() { Tabs({ barPosition: BarPosition.Start }) { - ForEach(this.tabArray.slice(Constants.SLICE_INDEX_ZERO, 4), (item: TabItem) => { + ForEach(this.tabArray.slice(0, 4), (item: TabItem) => { TabContent() { Row() { Text(item.name) - .height(Constants.CONTENT_HEIGHT) - .fontSize($r('app.float.content_font_size')) + .height(300) + .fontSize(30) } - .width(Constants.FULL_WIDTH) + .width('100%') .justifyContent(FlexAlign.Center) - .height(Constants.FULL_HEIGHT) + .height('100%') }.tabBar(this.tabBuilder(item.id, item.name)) }, (item: TabItem, index: number) => JSON.stringify(item) + index) } - .barWidth(Constants.FULL_WIDTH) - .barHeight($r('app.float.mainPage_barHeight')) - .width(Constants.FULL_WIDTH) - .height(Constants.FULL_HEIGHT) + .barWidth('100%') + .barHeight(52) + .width('100%') + .height('100%') .animationDuration(Constants.ANIMATION_DURATION) .onAnimationStart((index: number, targetIndex: number) => { hilog.info(0x0000, 'index', index.toString()); diff --git a/entry/src/main/ets/view/DiscoverPage.ets b/entry/src/main/ets/view/DiscoverPage.ets index d70b701..edf802a 100644 --- a/entry/src/main/ets/view/DiscoverPage.ets +++ b/entry/src/main/ets/view/DiscoverPage.ets @@ -1,6 +1,22 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { Constants } from '../common/Constants'; import { initTabData } from '../viewmodel/TabViewModel'; import { TabItem } from '../viewmodel/TabItem'; + @Component export struct DiscoverPage { @State tabArray: Array = initTabData(); diff --git a/entry/src/main/ets/view/VideoTabContent.ets b/entry/src/main/ets/view/VideoTabContent.ets index 15da670..8936bc9 100644 --- a/entry/src/main/ets/view/VideoTabContent.ets +++ b/entry/src/main/ets/view/VideoTabContent.ets @@ -179,13 +179,13 @@ export struct VideoTabContent { Text() .width(this.screenW - TabContentConstants.TAB_INTERVAL_NUMBER) .height(this.isTouch ? $r('app.integer.tab_text1_touch_height') : - $r('app.integer.tab_text1_height')) + $r('app.integer.tab_text1_height')) .borderRadius(this.isTouch ? $r('app.integer.tab_text1_touch_border_radius') : - $r('app.integer.tab_text1_borderradius')) + $r('app.integer.tab_text1_borderradius')) .backgroundColor($r('app.color.tab_text1_background_color')) .translate({ y: this.isTouch ? TabContentConstants.TAB_TEXT_TOUCH_TRANSLATE : - TabContentConstants.TAB_TEXT_TRANSLATE + TabContentConstants.TAB_TEXT_TRANSLATE }) .id(TabContentConstants.TAB_TEXT_ONE_ID) .margin({ @@ -195,12 +195,12 @@ export struct VideoTabContent { Text() .width(this.offsetX) .height(this.isTouch ? $r('app.integer.tab_text1_touch_height') : - $r('app.integer.tab_text1_height')) + $r('app.integer.tab_text1_height')) .borderRadius($r('app.integer.tab_text1_borderradius')) .backgroundColor($r('app.color.tab_text2_background_color')) .translate({ y: this.isTouch ? TabContentConstants.TAB_TEXT_TOUCH_TRANSLATE : - TabContentConstants.TAB_TEXT_TRANSLATE + TabContentConstants.TAB_TEXT_TRANSLATE }) .id(TabContentConstants.TAB_TEXT_TWO_ID) .alignRules({ @@ -239,8 +239,7 @@ export struct VideoTabContent { }) .onActionUpdate((event: GestureEvent) => { let playTime = - Math.floor(this.offsetX / (this.screenW - TabContentConstants.TAB_INTERVAL_NUMBER) * - this.totalTime); + Math.floor(this.offsetX / (this.screenW - TabContentConstants.TAB_INTERVAL_NUMBER) * this.totalTime); this.offsetX = this.positionX + event.offsetX; if (this.offsetX <= TabContentConstants.TAB_ZERO) { this.offsetX = TabContentConstants.TAB_ZERO; diff --git a/entry/src/main/ets/viewmodel/TabViewModel.ets b/entry/src/main/ets/viewmodel/TabViewModel.ets index 55abe1f..ae0c718 100644 --- a/entry/src/main/ets/viewmodel/TabViewModel.ets +++ b/entry/src/main/ets/viewmodel/TabViewModel.ets @@ -57,7 +57,7 @@ const TabTuItemData: BottomTabModel[] = [ new BottomTabModel($r('app.media.activePlus'), $r('app.media.activePlus'), '', true), new BottomTabModel($r('app.media.message'), $r('app.media.activeMessage'), $r('app.string.message')), new BottomTabModel($r('app.media.people'), $r('app.media.activePeople'),$r('app.string.tab_mine')) -] +]; const ClassifyData: ClassifyModel[] = [ new ClassifyModel(0, $r('app.string.popular_course')), @@ -67,4 +67,4 @@ const ClassifyData: ClassifyModel[] = [ new ClassifyModel(4, $r('app.string.developer_said')), new ClassifyModel(5, $r('app.string.back_end_development')), new ClassifyModel(6, $r('app.string.front_end_development')) -] \ No newline at end of file +]; \ No newline at end of file diff --git a/entry/src/main/resources/base/element/float.json b/entry/src/main/resources/base/element/float.json index 709e20d..50258f5 100644 --- a/entry/src/main/resources/base/element/float.json +++ b/entry/src/main/resources/base/element/float.json @@ -139,6 +139,22 @@ { "name": "drawer_padding", "value": "104vp" + }, + { + "name": "plus_icon_size", + "value": "24fp" + }, + { + "name": "plus_icon_margin_right", + "value": "24vp" + }, + { + "name": "underline_height", + "value": "1.5vp" + }, + { + "name": "underline_radius", + "value": "1vp" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index f855428..69b6163 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -263,6 +263,22 @@ { "name": "hot_dot", "value": "热点" + }, + { + "name": "left_tab", + "value": "居左对齐样式" + }, + { + "name": "tab", + "value": "页签" + }, + { + "name": "page", + "value": "这是页面" + }, + { + "name": "page_content", + "value": "的内容" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/base/profile/main_pages.json b/entry/src/main/resources/base/profile/main_pages.json index ea42bec..5cda187 100644 --- a/entry/src/main/resources/base/profile/main_pages.json +++ b/entry/src/main/resources/base/profile/main_pages.json @@ -11,6 +11,7 @@ "pages/WordTab", "pages/DrawerTab", "pages/TabContentOverflow", - "pages/DoubleNestingTabTwo" + "pages/DoubleNestingTabTwo", + "pages/LeftTab" ] } \ No newline at end of file diff --git a/entry/src/main/resources/en_US/element/string.json b/entry/src/main/resources/en_US/element/string.json index da41e2b..bbb81aa 100644 --- a/entry/src/main/resources/en_US/element/string.json +++ b/entry/src/main/resources/en_US/element/string.json @@ -263,6 +263,22 @@ { "name": "hot_dot", "value": "Hot spot" + }, + { + "name": "left_tab", + "value": "Left Alignment Style" + }, + { + "name": "tab", + "value": "tab" + }, + { + "name": "page", + "value": "this is page" + }, + { + "name": "page_content", + "value": "content" } ] } \ No newline at end of file diff --git a/entry/src/main/resources/zh_CN/element/string.json b/entry/src/main/resources/zh_CN/element/string.json index 5536c51..a15cc16 100644 --- a/entry/src/main/resources/zh_CN/element/string.json +++ b/entry/src/main/resources/zh_CN/element/string.json @@ -239,6 +239,22 @@ { "name": "front_end_development", "value": "前端开发" + }, + { + "name": "left_tab", + "value": "居左对齐样式" + }, + { + "name": "tab", + "value": "页签" + }, + { + "name": "page", + "value": "这是页面" + }, + { + "name": "page_content", + "value": "的内容" } ] } \ No newline at end of file diff --git a/screenshots/device/leftTab.gif b/screenshots/device/leftTab.gif new file mode 100644 index 0000000000000000000000000000000000000000..87996a8ba5f67c51270002d2884d6c29c7bb5f2d GIT binary patch literal 31639 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 Date: Thu, 10 Oct 2024 14:56:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B1=85?= =?UTF-8?q?=E5=B7=A6=E5=AF=B9=E9=BD=90=E5=AF=BC=E8=88=AA=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?review=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- entry/src/main/ets/pages/LeftTab.ets | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ff6681f..33b6f76 100644 --- a/README.md +++ b/README.md @@ -72,8 +72,8 @@ 1.本示例仅支持标准系统上运行,支持设备:华为手机。 -2.HarmonyOS系统:HarmonyOS NEXT Developer Beta1及以上。 +2.HarmonyOS系统:HarmonyOS NEXT Release及以上。 -3.DevEco Studio版本:DevEco Studio NEXT Developer Beta1及以上。 +3.DevEco Studio版本:DevEco Studio NEXT Release及以上。 -4.HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta1 SDK及以上。 \ No newline at end of file +4.HarmonyOS SDK版本:HarmonyOS NEXT Release SDK及以上。 \ No newline at end of file diff --git a/entry/src/main/ets/pages/LeftTab.ets b/entry/src/main/ets/pages/LeftTab.ets index 2b59470..37f1247 100644 --- a/entry/src/main/ets/pages/LeftTab.ets +++ b/entry/src/main/ets/pages/LeftTab.ets @@ -29,9 +29,9 @@ struct LeftTab { private tabLeftOffset: number = 0; private animationDuration: number = 300; private resource: resourceManager.ResourceManager | undefined = AppStorage.get('resourceManager'); - private tabStr: string = this.resource?.getStringSync($r('app.string.tab')?.id) ?? '页签'; - private pageStr: string = this.resource?.getStringSync($r('app.string.page')?.id) ?? '这是页面'; - private contentStr: string = this.resource?.getStringSync($r('app.string.page_content')?.id) ?? '的内容'; + private tabStr: string = this.resource?.getStringSync($r('app.string.tab')?.id) ?? 'tab'; + private pageStr: string = this.resource?.getStringSync($r('app.string.page')?.id) ?? 'this is page'; + private contentStr: string = this.resource?.getStringSync($r('app.string.page_content')?.id) ?? 'content'; @Builder tab(tabName: string, _tabItem: number, tabIndex: number) { -- Gitee