基於鴻蒙ArkUI封裝標題欄TitleBar導航元件

xiaoyan2017發表於2024-10-31

這段時間一直學習鴻蒙os開發知識,由於ArkUI內建的導航條元件功能有限,於是就自己開發了一個自定義harmonyos導航條元件。

HMNavBar導航條支援返回鍵、標題/副標題、標題居中、背景色/背景圖片/背景漸變色、標題顏色、搜尋、右側操作區等功能。

image.png

@Component
export struct HMNavBar {
  // 是否隱藏左側的返回鍵
  @Prop hideBackButton: boolean
  // 標題(支援字串|自定義元件)
  @BuilderParam title: ResourceStr | CustomBuilder = BuilderFunction
  // 副標題
  @BuilderParam subtitle: ResourceStr | CustomBuilder = BuilderFunction
  // 返回鍵圖示
  @Prop backButtonIcon: Resource | undefined = $r('sys.symbol.chevron_left')
  // 返回鍵標題
  @Prop backButtonTitle: ResourceStr
  // 背景色
  @Prop bgColor: ResourceColor = $r('sys.color.background_primary')
  // 漸變背景色
  @Prop bgLinearGradient: LinearGradient
  // 圖片背景
  @Prop bgImage: ResourceStr | PixelMap
  // 標題顏色
  @Prop fontColor: ResourceColor
  // 標題是否居中
  @Prop centerTitle: boolean
  // 右側按鈕區域
  @BuilderParam actions: Array<ActionMenuItem> | CustomBuilder = BuilderFunction
  // 導航條高度
  @Prop navbarHeight: number = 56

  // ...
}

HMNavBar({
  backButtonIcon: $r('sys.symbol.arrow_left'),
  title: '鴻蒙自定義導航欄',
  subtitle: 'HarmonyOS Next 5.0自定義導航欄',
})
@Builder customImgTitle() {
  Image('https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/logo-developer-header.svg').height(24).objectFit(ImageFit.Contain)
}

HMNavBar({
  backButtonIcon: $r('sys.symbol.chevron_left'),
  backButtonTitle: '返回',
  title: this.customImgTitle,
  subtitle: '鴻蒙5.0 api 12',
  centerTitle: true,
  bgColor: '#f3f6f9',
  fontColor: '#0a59f7',
  actions: [
    {
      icon: $r('app.media.app_icon'),
      action: () => promptAction.showToast({ message: "show toast index 1" })
    },
    {
      // icon: $r('sys.symbol.plus'),
      label: '更多>',
      color: '#bd43ff',
      action: () => promptAction.showToast({ message: "show toast index 2" })
    }
  ]
})
// 自定義漸變背景、背景圖片、右側操作區
HMNavBar({
  hideBackButton: true,
  title: 'HarmonyOS',
  subtitle: 'harmonyos next 5.0 api 12',
  bgLinearGradient: {
    angle: 135,
    colors: [['#42d392 ',0.2], ['#647eff',1]]
  },
  // bgImage: 'pages/assets/nav_bg.png',
  // bgImage: 'https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/1025-pc-banner.jpeg',
  fontColor: '#fff',
  actions: [
    {
      icon: 'https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/yuanfuwuicon.png',
      action: () => promptAction.showToast({ message: "show toast index 1" })
    },
    {
      icon: 'https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/0620logo4.png',
      action: () => promptAction.showToast({ message: "show toast index 2" })
    },
    {
      icon: $r('sys.symbol.person_crop_circle_fill_1'),
      action: () => promptAction.showToast({ message: "show toast index 3" })
    }
  ],
  navbarHeight: 70
})

2ff8c6f0b12ac24324b091159ad23782_1289798-20241031130138165-1440903000.png

HMNavBar({
  title: this.customSearchTitle1,
  actions: this.customSearchAction
})

HMNavBar({
  hideBackButton: true,
  title: this.customSearchTitle2,
  bgColor: '#0051ff',
})

HMNavBar({
  backButtonIcon: $r('sys.symbol.arrow_left'),
  backButtonTitle: '鴻蒙',
  title: this.customSearchTitle3,
  bgColor: '#c543fd',
  fontColor: '#fff',
  actions: [
    {
      icon: $r('sys.symbol.mic_fill'),
      action: () => promptAction.showToast({ ... })
    }
  ]
})

2ff8c6f0b12ac24324b091159ad23782_1289798-20241031130138165-1440903000.png

build() {
    Flex() {
      // 左側模組
      Stack({ alignContent: Alignment.Start }) {
        Flex(){
          if(!this.hideBackButton) {
            this.backBuilder()
          }
          if(!this.centerTitle) {
            this.contentBuilder()
          }
        }
        .height('100%')
      }
      .height('100%')
      .layoutWeight(1)

      // 中間模組
      if(this.centerTitle) {
        Stack() {
          this.contentBuilder()
        }
        .height('100%')
        .layoutWeight(1)
      }

      // 右鍵操作模組
      Stack({ alignContent: Alignment.End }) {
        this.actionBuilder()
      }
      .padding({ right: 16 })
      .height('100%')
      .layoutWeight(this.centerTitle ? 1 : 0)
    }
    .backgroundColor(this.bgColor)
    .linearGradient(this.bgLinearGradient)
    .backgroundImage(this.bgImage, ImageRepeat.NoRepeat).backgroundImageSize(ImageSize.FILL)
    .height(this.navbarHeight)
    .width('100%')
}

ArkUI實現自定義漸變背景。

.linearGradient({
  angle: 135,
  colors: [['#42d392 ',0.2], ['#647eff',1]]
})

ArkUI除了linearGradient線性漸變外,還提供sweepGradient角度漸變、radialGradient徑向漸變。
還可以使用direction引數,從某一固定方向到另一個方向漸變,比如RightTop右上角->左下角。

vue3+tauri2.0桌面端後臺Exe系統|tauri2+rust+vite5管理系統後臺模板

vite5+tauri2.0客戶端仿微信Exe聊天程式|tauri2+rust+vue3聊天例項

vue3+electron31仿微信客戶端Exe聊天

Electron32-ViteOS桌面版os系統|vue3+electron+arco客戶端OS管理模板

Ending,感謝各位的閱讀與支援!

相關文章