華為鴻蒙應(yīng)用--底部導(dǎo)航欄Tabs(自適應(yīng)手機(jī)和平板)

鴻蒙ArkTS Tabs組件開(kāi)發(fā)底部導(dǎo)航欄陕凹,可自適應(yīng)平板和手機(jī),相當(dāng)于Android開(kāi)發(fā)中的MainActivity+Fragment的底部導(dǎo)航欄模式。


一先誉、主頁(yè):MainPage.ets

import { BreakpointSystem, BreakpointConstants, StyleConstants, PageConstants, } from '@ohos/common';? // 通用工具

import { Chat } from '@ohos/chat';? // 子模塊 相當(dāng)于Android 的Fragment

import { Contact } from '@ohos/Contact';? // 子模塊

import { Work } from '@ohos/Work';? //? 子模塊

import { Mine } from '@ohos/Mine';? //? 子模塊

import { buttonInfo, ButtonInfoModel } from '../viewmodel/MainPageData'; // 底部導(dǎo)航數(shù)據(jù)

@Entry

@Component

struct MainPage {

? @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm';

? @State currentPageIndex: number = 0;

? private breakpointSystem = new BreakpointSystem();

? aboutToAppear() {

? ? this.breakpointSystem.register();

? }

? aboutToDisappear() {

? ? this.breakpointSystem.unregister();

? }

? @Builder BottomNavigation(button: ButtonInfoModel) {

? ? Column({ space: PageConstants.BUTTON_SPACE }) {? //? static readonly BUTTON_SPACE: string = '6vp';

? ? ? Image(this.currentPageIndex === button.index ? button.selectImg : button.img)

? ? ? ? .objectFit(ImageFit.Contain)

? ? ? ? .width($r('app.float.main_image_size'))

? ? ? ? .height($r('app.float.main_image_size'))

? ? ? Text(button.title)

? ? ? ? .fontColor(this.currentPageIndex === button.index ? $r('app.color.focus_color') : $r('app.color.un_focus_color'))

? ? ? ? .opacity(this.currentPageIndex === button.index ? StyleConstants.FULL_OPACITY : StyleConstants.SIXTY_OPACITY)

? ? ? ? .fontWeight(StyleConstants.FONT_WEIGHT_FIVE)

? ? ? ? .textAlign(TextAlign.Center)

? ? ? ? .fontSize($r('app.float.micro_font_size'))

? ? }

? ? .width(StyleConstants.FULL_WIDTH)

? ? .height(StyleConstants.FULL_HEIGHT)

? ? .alignItems(HorizontalAlign.Center)

? ? .justifyContent(FlexAlign.Center)

? }

? build() {

? ? Column() {

? ? ? Tabs({

? ? ? ? barPosition: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?

? ? ? ? BarPosition.Start : BarPosition.End,

? ? ? ? index: this.currentPageIndex,

? ? ? }) {

? ? ? ? TabContent() {

? ? ? ? ? Chat() // 子模塊

? ? ? ? }.tabBar(this.BottomNavigation(buttonInfo[0]))

? ? ? ? TabContent() {

? ? ? ? ? Contact() // 子模塊

? ? ? ? }.tabBar(this.BottomNavigation(buttonInfo[1]))

? ? ? ? TabContent() {

? ? ? ? ? Work() // 子模塊

? ? ? ? }.tabBar(this.BottomNavigation(buttonInfo[2]))

? ? ? ? TabContent() {

? ? ? ? ? Mine() // 子模塊

? ? ? ? }.tabBar(this.BottomNavigation(buttonInfo[3]))

? ? ? }

? ? ? .barWidth(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?

? ? ? $r('app.float.bar_width') : StyleConstants.FULL_WIDTH)

? ? ? .barHeight(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?

? ? ? StyleConstants.SIXTY_HEIGHT : $r('app.float.vp_fifty_six'))

? ? ? .vertical(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG)

? ? ? .scrollable(false)

? ? ? .onChange((index: number) => {

? ? ? ? this.currentPageIndex = index;

? ? ? ? // 提前查詢數(shù)據(jù)

? ? ? ? // if (index === 1) {

? ? ? ? //? this.queryShopCart();

? ? ? ? // } else if (index === 2) {

? ? ? ? //? this.queryOrderList();

? ? ? ? // }

? ? ? })

? ? }

? ? .backgroundColor($r('app.color.page_background'))

? }

}

StyleConstants.ets:

/**

* Constants for common style.

*/

export class StyleConstants {

? /**

? * Component width percentage: 100%.

? */

? static readonly FULL_WIDTH: string = '100%';

? /**

? * Component height percentage: 100%.

? */

? static readonly FULL_HEIGHT: string = '100%';

? /**

? * Component height percentage: 70%.

? */

? static readonly SEVENTY_HEIGHT: string = '70%';

? /**

? * Component height percentage: 60%.

? */

? static readonly SIXTY_HEIGHT: string = '60%';

? /**

? * Component width percentage: 60%.

? */

? static readonly SIXTY_WIDTH: string = '60%';

? /**

? * Component height percentage: 50%.

? */

? static readonly FIFTY_HEIGHT: string = '50%';

? /**

? * Component height percentage: 50%.

? */

? static readonly HUNDRED_FIFTEEN_WIDTH: string = '115%';

? /**

? * Component space vp : 4.

? */

? static readonly FOUR_SPACE: string = '4vp';

? /**

? * Component space vp : 12.

? */

? static readonly TWELVE_SPACE: string = '12vp';

? /**

? * Component space vp : 14.

? */

? static readonly ITEM_SPACE: string = '14vp';

? /**

? * Component space vp : 15.

? */

? static readonly FIFTEEN_SPACE: string = '15vp';

? /**

? * Font weight value: 700.

? */

? static readonly FONT_WEIGHT_SEVEN: number = 700;

? /**

? * Font weight value: 500.

? */

? static readonly FONT_WEIGHT_FIVE: number = 500;

? /**

? * Font weight value: 400.

? */

? static readonly FONT_WEIGHT_FOUR: number = 400;

? /**

? * Text line value: 2.

? */

? static readonly TWO_TEXT_LINE: number = 2;

? /**

? * Component opacity value: 1.

? */

? static readonly FULL_OPACITY: number = 1;

? /**

? * Component opacity value: 0.6.

? */

? static readonly SIXTY_OPACITY: number = 0.6;

? /**

? * Component opacity value: 0.8.

? */

? static readonly EIGHTY_OPACITY: number = 0.8;

? /**

? * Component layout value: 1.

? */

? static readonly LAYOUT_WEIGHT: number = 1;

? /**

? * Flex basic value: 1.

? */

? static readonly FLEX_BASIC: number = 1;

? /**

? * Flex shrink value: 1.

? */

? static readonly FLEX_SHRINK: number = 1;

? /**

? * Flex grow value: 1.

? */

? static readonly FLEX_GROW: number = 1;

? /**

? * Swiper or list display count value: 1.

? */

? static readonly DISPLAY_ONE: number = 1;

? /**

? * Swiper or list display count value: 2.

? */

? static readonly DISPLAY_TWO: number = 2;

? /**

? * Swiper or list display count value: 3.

? */

? static readonly DISPLAY_THREE: number = 3;

? /**

? * Swiper or list display count value: 4.

? */

? static readonly DISPLAY_FOUR: number = 4;

? /**

? * Image aspect ratio value: 2.23.

? */

? static readonly IMAGE_ASPECT_RATIO: number = 2.25;

? /**

? * Number of value: 0.5.

? */

? static readonly HALF_ONE: number = 0.5;

? /**

? * Number of value: -1.

? */

? static readonly MINUS_ONE: number = -1;

}

二拌阴、BreakpointSystem.ets:響應(yīng)式設(shè)計(jì)的核心

import mediaQuery from '@ohos.mediaquery';

import { BreakpointConstants } from '../constants/BreakpointConstants';

declare interface BreakPointTypeOption<T> {

? sm?: T

? md?: T

? lg?: T

? xl?: T

? xxl?: T

}

/**

* 媒體查詢(mediaquery)

* 響應(yīng)式設(shè)計(jì)的核心

*/

export class BreakPointType<T> {

? options: BreakPointTypeOption<T>

? constructor(option: BreakPointTypeOption<T>) {

? ? this.options = option

? }

? getValue(currentBreakPoint: string): T {

? ? return this.options[currentBreakPoint] as T

? }

}

export class BreakpointSystem {

? private currentBreakpoint: string = '';

? private smListener?: mediaQuery.MediaQueryListener;

? private mdListener?: mediaQuery.MediaQueryListener;

? private lgListener?: mediaQuery.MediaQueryListener;

? private updateCurrentBreakpoint(breakpoint: string) {

? ? if (this.currentBreakpoint !== breakpoint) {

? ? ? this.currentBreakpoint = breakpoint;

? ? ? AppStorage.Set<string>(BreakpointConstants.CURRENT_BREAKPOINT, this.currentBreakpoint);

? ? }

? }

? private isBreakpointSM = (mediaQueryResult: mediaQuery.MediaQueryResult) => {

? ? if (mediaQueryResult.matches) {

? ? ? this.updateCurrentBreakpoint(BreakpointConstants.BREAKPOINT_SM);

? ? }

? }

? private isBreakpointMD = (mediaQueryResult: mediaQuery.MediaQueryResult) => {

? ? if (mediaQueryResult.matches) {

? ? ? this.updateCurrentBreakpoint(BreakpointConstants.BREAKPOINT_MD);

? ? }

? }

? private isBreakpointLG = (mediaQueryResult: mediaQuery.MediaQueryResult) => {

? ? if (mediaQueryResult.matches) {

? ? ? this.updateCurrentBreakpoint(BreakpointConstants.BREAKPOINT_LG);

? ? }

? }

? public register() {

? ? this.smListener = mediaQuery.matchMediaSync(BreakpointConstants.RANGE_SM);

? ? this.smListener.on('change', this.isBreakpointSM);

? ? this.mdListener = mediaQuery.matchMediaSync(BreakpointConstants.RANGE_MD);

? ? this.mdListener.on('change', this.isBreakpointMD);

? ? this.lgListener = mediaQuery.matchMediaSync(BreakpointConstants.RANGE_LG);

? ? this.lgListener.on('change', this.isBreakpointLG);

? }

? public unregister() {

? ? this.smListener?.off('change', this.isBreakpointSM);

? ? this.mdListener?.off('change', this.isBreakpointMD);

? ? this.lgListener?.off('change', this.isBreakpointLG);

? }

}

BreakpointConstants.ets:

export class BreakpointConstants {

? /**

? * Breakpoints that represent small device types.

? */

? static readonly BREAKPOINT_SM: string = 'sm';

? /**

? * Breakpoints that represent middle device types.

? */

? static readonly BREAKPOINT_MD: string = 'md';

? /**

? * Breakpoints that represent large device types.

? */

? static readonly BREAKPOINT_LG: string = 'lg';

? /**

? * Current breakpoints that to query the device types.

? */

? static readonly CURRENT_BREAKPOINT: string = 'currentBreakpoint';

? /**

? * Range of the small device width.

? */

? static readonly RANGE_SM: string = '(320vp<=width<520vp)';

? /**

? * Range of the middle device width.

? */

? static readonly RANGE_MD: string = '(520vp<=width<840vp)';

? /**

? * Range of the large device width.

? */

? static readonly RANGE_LG: string = '(840vp<=width)';

}

三绍绘、ButtonInfoModel.ets:底部導(dǎo)航按鈕數(shù)據(jù)

export class ButtonInfoModel {

? index: number ;? // 序號(hào)

? img: Resource;? // 未選中圖片

? selectImg: Resource ; // 選中圖片

? title: Resource; // 按鈕名稱

}

const buttonInfo: ButtonInfoModel[] = [

? {

? ? index: 0,

? ? img: $r('app.media.ic_chat_off'),

? ? selectImg: $r('app.media.ic_chat_on'),

? ? title: $r('app.string.chat')

? },

? {

? ? index: 1,

? ? img: $r('app.media.ic_contact_off'),

? ? selectImg: $r('app.media.ic_contact_on'),

? ? title: $r('app.string.contact')

? },

? {

? ? index: 2,

? ? img: $r('app.media.ic_work_off'),

? ? selectImg: $r('app.media.ic_work_on'),

? ? title: $r('app.string.work')

? },

? {

? ? index: 3,

? ? img: $r('app.media.ic_mine_off'),

? ? selectImg: $r('app.media.ic_mine_on'),

? ? title: $r('app.string.mine')

? }

]

export { buttonInfo }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迟赃,隨后出現(xiàn)的幾起案子陪拘,更是在濱河造成了極大的恐慌,老刑警劉巖纤壁,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左刽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酌媒,警方通過(guò)查閱死者的電腦和手機(jī)欠痴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秒咨,“玉大人喇辽,你說(shuō)我怎么就攤上這事∈没纾” “怎么了茵臭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舅世。 經(jīng)常有香客問(wèn)我旦委,道長(zhǎng),這世上最難降的妖魔是什么雏亚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任缨硝,我火速辦了婚禮,結(jié)果婚禮上罢低,老公的妹妹穿的比我還像新娘查辩。我一直安慰自己,他們只是感情好网持,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布宜岛。 她就那樣靜靜地躺著,像睡著了一般功舀。 火紅的嫁衣襯著肌膚如雪萍倡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天辟汰,我揣著相機(jī)與錄音列敲,去河邊找鬼阱佛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛戴而,可吹牛的內(nèi)容都是我干的凑术。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼所意,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淮逊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扁眯,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壮莹,失蹤者是張志新(化名)和其女友劉穎翅帜,沒(méi)想到半個(gè)月后姻檀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涝滴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绣版,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼疮。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杂抽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韩脏,到底是詐尸還是另有隱情缩麸,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布赡矢,位于F島的核電站杭朱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吹散。R本人自食惡果不足惜弧械,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望空民。 院中可真熱鬧刃唐,春花似錦、人聲如沸界轩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浊猾。三九已至抖甘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与殃,已是汗流浹背单山。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工碍现, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人米奸。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓昼接,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悴晰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慢睡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容