0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入淺出學(xué)習(xí)eTs之電話提示功能實現(xiàn)

Harmony&嵌入式學(xué)習(xí) ? 來源:Harmony&嵌入式學(xué)習(xí) ? 作者:Harmony&嵌入式學(xué) ? 2023-05-13 13:26 ? 次閱讀

一、需求分析

相信大家都接過電話吧,咳咳,本節(jié)來模擬一個不喜歡接電話的小朋友,在切換界面上加上小紅點,具體的通話界面之后可能會做

實現(xiàn)頁面切換

不同頁面顯示不同內(nèi)容

可顯示角標(biāo)(小紅點)

二、控件介紹

(1)Tabs

一種可以通過頁簽進行內(nèi)容視圖切換的容器組件,每個頁簽對應(yīng)一個內(nèi)容視圖。

說明:

該組件從API Version 7開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨標(biāo)記該內(nèi)容的起始版本。

接口

Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: TabsController})

參數(shù)

參數(shù)名 參數(shù)類型 必填 參數(shù)描述
barPosition BarPosition 指定頁簽位置來創(chuàng)建Tabs容器組件。 默認(rèn)值:BarPosition.Start
index number 指定初次初始頁簽索引。 默認(rèn)值:0
controller TabsController 設(shè)置Tabs控制器。

BarPosition枚舉說明

名稱 描述
Start vertical屬性方法設(shè)置為true時,頁簽位于容器左側(cè);vertical屬性方法設(shè)置為false時,頁簽位于容器頂部。
End vertical屬性方法設(shè)置為true時,頁簽位于容器右側(cè);vertical屬性方法設(shè)置為false時,頁簽位于容器底部。

屬性

不支持觸摸熱區(qū)設(shè)置,除支持通用屬性外,還支持以下屬性:

名稱 參數(shù)類型 描述
vertical boolean 設(shè)置為false是為橫向Tabs,設(shè)置為true時為縱向Tabs。 默認(rèn)值:false
scrollable boolean 設(shè)置為true時可以通過滑動頁面進行頁面切換,為false時不可滑動切換頁面。 默認(rèn)值:true
barMode BarMode TabBar布局模式,具體描述見BarMode枚舉說明。 默認(rèn)值:BarMode.Fixed
barWidth number | Length8+ TabBar的寬度值。
barHeight number | Length8+ TabBar的高度值。
animationDuration number TabContent滑動動畫時長。 默認(rèn)值:200

BarMode枚舉說明

名稱 描述
Scrollable TabBar使用實際布局寬度, 超過總長度后可滑動。
Fixed 所有TabBar平均分配寬度。

wKgZomRfH32AQuFxAAD-Y3TM968719.gif

(2)TabContentOpenAtom OpenHarmony

僅在Tabs中使用,對應(yīng)一個切換頁簽的內(nèi)容視圖。

說明:

該組件從API Version 7開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨標(biāo)記該內(nèi)容的起始版本。

屬性

除支持通用屬性外,還支持以下屬性:

名稱 參數(shù)類型 描述
tabBar string | Resource | { icon?: string | Resource, text?: string | Resource } | CustomBuilder8+ 設(shè)置TabBar上顯示內(nèi)容。 CustomBuilder: 構(gòu)造器,內(nèi)部可以傳入組件(API8版本以上適用)。 > 說明: > 如果icon采用svg格式圖源,則要求svg圖源刪除其自有寬高屬性值。如采用帶有自有寬高屬性的svg圖源,icon大小則是svg本身內(nèi)置的寬高屬性值大小。

說明:

TabContent組件不支持設(shè)置通用寬度屬性,其寬度默認(rèn)撐滿Tabs父組件。

TabContent組件不支持設(shè)置通用高度屬性,其高度由Tabs父組件高度與TabBar組件高度決定。

TabContent組件不支持觸摸熱區(qū)設(shè)置。

wKgaomRfH36AUkTXAAFhS6GenyY417.gif

// xxx.ets
@Entry
@Component
struct TabContentExample  {
  @State fontColor: string = 'rgba(0, 0, 0, 0.4)'
  @State selectedFontColor: string = 'rgba(10, 30, 255, 1)'
  @State currentIndex: number = 0
  private controller: TabsController = new TabsController()
  @Builder TabBuilder(index: number) {
    Column() {
      Image(this.currentIndex === index ? '/resources/ic_public_contacts_filled_selected.png' : '/resources/ic_public_contacts_filled.png')
        .width(10)
        .height(10)
        .opacity(this.currentIndex === index ? 1 : 0.4)
        .objectFit(ImageFit.Contain)
      Text(`Tab${(index > 2 ? (index - 1) : index) + 1}`)
        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
        .fontSize(10)
        .margin({top: 2})
    }
  }

  @Builder AddBuilder() {
    Column() {
      Image(this.currentIndex === 2 ? '/resources/ic_public_add_norm_filled_selected.png' : '/resources/ic_public_add_norm_filled.png')
        .width(this.currentIndex === 2 ? 26 : 24)
        .height(this.currentIndex === 2 ? 26 : 24)
        .opacity(this.currentIndex === 2 ? 1 : 0.4)
        .objectFit(ImageFit.Contain)
        .animation({duration: 200})
    }
  }

  build() {
    Column() {
      Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
        TabContent() {
          Flex({justifyContent: FlexAlign.Center}) {
            Text('Tab1').fontSize(32)
          }
        }.tabBar(this.TabBuilder(0))

        TabContent() {
          Flex({justifyContent: FlexAlign.Center}) {
            Text('Tab2').fontSize(32)
          }
        }.tabBar(this.TabBuilder(1))

        TabContent() {
          Flex({justifyContent: FlexAlign.Center}) {
            Text('Add').fontSize(32)
          }
        }.tabBar(this.AddBuilder())

        TabContent() {
          Flex({justifyContent: FlexAlign.Center}) {
            Text('Tab3').fontSize(32)
          }
        }.tabBar(this.TabBuilder(3))

        TabContent() {
          Flex({justifyContent: FlexAlign.Center}) {
            Text('Tab4').fontSize(32)
          }
        }.tabBar(this.TabBuilder(4))
      }
      .vertical(false)
      .barWidth(300).barHeight(56)
      .onChange((index: number) => {
        this.currentIndex = index
      })
      .width('90%').backgroundColor('rgba(241, 243, 245, 0.95)')
    }.width('100%').height(200).margin({ top: 5 })
  }
}

(3)BadgeOpenAtom OpenHarmony

可以附加在單個組件上用于信息標(biāo)記的容器組件。

說明: 該組件從API Version 7開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨標(biāo)記該內(nèi)容的起始版本。

Badge({
  value: ' ',
  position: BadgePosition.Left,                // 設(shè)置 badge 居左顯示
  style: {badgeSize: 10, badgeColor: Color.Red}// 設(shè)置 badge 的顯示樣式
}) {
  Text("Badge")
    .size({width: 100, height: 50})
    .fontSize(20)
    .backgroundColor("#aabbcc")
}
.size({width: 100, height: 50})

Badge({
  value: ' ',
  position: BadgePosition.Right,               // 設(shè)置 badge 居右顯示
  style: {badgeSize: 10, badgeColor: Color.Red}// 設(shè)置 badge 的顯示樣式
}) {
  Text("Badge")
    .size({width: 100, height: 50})
    .fontSize(20)
    .backgroundColor("#aabbcc")
}
.size({width: 100, height: 50})

Badge({
  value: ' ',
  position: BadgePosition.RightTop,            // 設(shè)置 badge 居右上角顯示
  style: {badgeSize: 10, badgeColor: Color.Red}// 設(shè)置 badge 的顯示樣式
}) {
  Text("Badge")
    .size({width: 100, height: 50})
    .fontSize(20)
    .backgroundColor("#aabbcc")
}
.size({width: 100, height: 50})

wKgZomRfH36AFbnhAABPtqO5088462.png

三、UI設(shè)計

(1)頁面切換

首先需要創(chuàng)建一個TabContent組件,實現(xiàn)頁面切換

wKgaomRfH3-AMY_PAACWaUr5SGg221.gif

@Entry @Component struct TabsTest {

  private controller: TabsController = new TabsController();

  @State index: number = 0; // 選項卡下標(biāo),默認(rèn)為第一個

  @Builder tabMessage() {   // 自定義消息標(biāo)簽
    Column() {
      Column() {
        Blank()
        Image(this.index == 0 ? 'pages/icon_message_selected.png' : 'pages/icon_message_normal.png')
          .size({width: 25, height: 25})
        Text('消息')
          .fontSize(16)
          .fontColor(this.index == 0 ? "#2a58d0" : "#6b6b6b")
        Blank()
      }
      .height('100%')
      .width("100%")
      .onClick(() => {
        this.index = 0;
        this.controller.changeIndex(this.index);
      })
    }
  }

  @Builder tabContract() {  // 自定義聯(lián)系人標(biāo)簽
    Column() {
      Blank()
      Image(this.index == 1 ? 'pages/icon_contract_selected.png' : 'pages/icon_contract_normal.png')
        .size({width: 25, height: 25})
      Text('聯(lián)系人')
        .fontSize(16)
        .fontColor(this.index == 1 ? "#2a58d0" : "#6b6b6b")
      Blank()
    }
    .height('100%')
    .width("100%")
    .onClick(() => {
      this.index = 1;
      this.controller.changeIndex(this.index);
    })
  }

  @Builder tabDynamic() {   // 自定義動態(tài)標(biāo)簽
    Column() {
      Blank()
      Image(this.index == 2 ? 'pages/icon_dynamic_selected.png' : 'pages/icon_dynamic_normal.png')
        .size({width: 25, height: 25})
      Text('動態(tài)')
        .fontSize(16)
        .fontColor(this.index == 2 ? "#2a58d0" : "#6b6b6b")
      Blank()
    }
    .height('100%')
    .width("100%")
    .onClick(() => {
      this.index = 2;
      this.controller.changeIndex(this.index);
    })
  }

  build() {
    Column() {
      Tabs({
        barPosition: BarPosition.End, // TabBar排列在下方
        controller: this.controller   // 綁定控制器
      }) {
        TabContent() {
          Column() {
            Text('消息')
              .fontSize(30)
          }
          .width('100%')
          .height('100%')
          .backgroundColor("#aabbcc")
        }
        .tabBar(this.tabMessage)      // 使用自定義TabBar

        TabContent() {
          Column() {
            Text('聯(lián)系人')
              .fontSize(30)
          }
          .width('100%')
          .height('100%')
          .backgroundColor("#bbccaa")
        }
        .tabBar(this.tabContract)     // 使用自定義TabBar

        TabContent() {
          Column() {
            Text('動態(tài)')
              .fontSize(30)
          }
          .width('100%')
          .height('100%')
          .backgroundColor("#ccaabb")
        }
        .tabBar(this.tabDynamic)      // 使用自定義TabBar
      }
      .width('100%')
      .height('100%')
      .barHeight(60)
      .barMode(BarMode.Fixed)         // TabBar均分
      .onChange((index: number) => {  // 頁面切換回調(diào)
        this.index = index;
      })
    }
    .width('100%')
    .height('100%')
  }
}

(2)圖標(biāo)修改

wKgZomRfH3-APX6XAABYSwkl-NE501.png

在Tab組件中,圖標(biāo)需要選擇兩種風(fēng)格,一個是沒有點擊到的,另一個是被選中的狀態(tài),我這里使用本色和紅色來演示

wKgaomRfH4CAI-LQAAALWI5UMi4382.png


wKgZomRfH4CAPt50AAAJwYB0Bmk355.png

(3)角標(biāo)添加

這里加入傳統(tǒng)的角標(biāo)顏色,小紅點來實現(xiàn),當(dāng)前未接電話有14個

wKgaomRfH4GAfSp5AABd1t66JZA030.png

  @Builder tabMessage() {   // 自定義消息標(biāo)簽
    Badge({
      count: 14,                       // 設(shè)置 badge 顯示的數(shù)量
      maxCount: 100,                   // 設(shè)置 badge 顯示的最大數(shù)量
      position: BadgePosition.RightTop,// 設(shè)置 badge 顯示在右上角
      style: {badgeColor: Color.Red,fontSize:15,badgeSize:30}   // 設(shè)置 badge 的顯示樣式
       }) {

      Column() {
        Column() {
          Blank()
          Image(this.index == 0 ? 'pages/電話2.png' : 'pages/電話.png')
            .size({ width: 25, height: 25 })
          Text('電話')
            .fontSize(16)
            .fontColor(this.index == 0 ? "#2a58d0" : "#6b6b6b")
          Blank()
        }
        .height('100%')
        .width("100%")
        .onClick(() => {
          this.index = 0;
          this.controller.changeIndex(this.index);
        })
      }
    }
  }

四、成功展示

wKgZomRfH4KADPiFAAHfCBTsSGk441.gif

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    499

    瀏覽量

    22101
  • ets
    ets
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    1630
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3744

    瀏覽量

    16501
收藏 人收藏

    評論

    相關(guān)推薦

    #深入淺出學(xué)習(xí)eTs#(八)“猜大小”小游戲

    本項目Gitee倉地址:[深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)
    的頭像 發(fā)表于 05-17 15:08 ?1070次閱讀
    #<b class='flag-5'>深入淺出</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>eTs</b>#(八)“猜大小”小游戲

    #深入淺出學(xué)習(xí)eTs#(十)藍(lán)藥丸還是紅藥丸

    本項目Gitee倉地址: 深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)
    的頭像 發(fā)表于 05-17 15:07 ?992次閱讀
    #<b class='flag-5'>深入淺出</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>eTs</b>#(十)藍(lán)藥丸還是紅藥丸

    ARM7 深入淺出學(xué)習(xí)

    深入淺出ARM7 LPC213x_214 學(xué)習(xí)
    發(fā)表于 12-04 17:28

    深入淺出排序學(xué)習(xí)使用指南

    深入淺出排序學(xué)習(xí):寫給程序員的算法系統(tǒng)開發(fā)實踐
    發(fā)表于 09-16 11:38

    #深入淺出學(xué)習(xí)eTs#(一)模擬器/真機環(huán)境搭建

    本項目的Gitee倉地址: 深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com
    發(fā)表于 12-24 13:02

    #深入淺出學(xué)習(xí)eTs#(二)拖拽式UI

    本項目Gitee倉地址:深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)一
    發(fā)表于 12-29 09:56

    #深入淺出學(xué)習(xí)eTs#(七)判斷密碼是否正確

    本項目Gitee倉地址:深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)一
    發(fā)表于 12-29 10:06

    #深入淺出學(xué)習(xí)eTs#(十一)別忘了吃藥喔

    本項目Gitee倉地址:深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)一
    發(fā)表于 12-29 13:33

    深入淺出Cortex-M0學(xué)習(xí)資料

    深入淺出Cortex-M0學(xué)習(xí)資料
    發(fā)表于 06-18 10:50 ?0次下載
    <b class='flag-5'>深入淺出</b>Cortex-M0<b class='flag-5'>學(xué)習(xí)</b>資料

    STM32深入淺出新手篇

    STM32深入淺出新手篇,很好的單片機學(xué)習(xí)資料。
    發(fā)表于 03-21 17:43 ?128次下載

    深入淺出學(xué)習(xí)250個通信原理資源下載

    深入淺出學(xué)習(xí)250個通信原理資源下載
    發(fā)表于 04-12 09:16 ?28次下載

    深入淺出學(xué)習(xí)低功耗藍(lán)牙協(xié)議棧

    深入淺出學(xué)習(xí)低功耗藍(lán)牙協(xié)議棧
    發(fā)表于 06-23 10:35 ?57次下載

    深入淺出學(xué)習(xí)eTs(一)模擬器/真機環(huán)境搭建

    本項目的Gitee倉地址: 深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com
    的頭像 發(fā)表于 05-13 13:17 ?1752次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>eTs</b>(一)模擬器/真機環(huán)境搭建

    深入淺出學(xué)習(xí)eTs(七)如何判斷密碼是否正確

    本項目Gitee倉地址: 深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)
    的頭像 發(fā)表于 05-13 13:20 ?948次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>eTs</b>(七)如何判斷密碼是否正確

    深入淺出學(xué)習(xí)eTs九宮格密碼鎖功能實現(xiàn)

    本項目Gitee倉地址:深入淺出eTs學(xué)習(xí): 帶大家深入淺出學(xué)習(xí)eTs (gitee.com)
    的頭像 發(fā)表于 05-13 13:25 ?1640次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>eTs</b><b class='flag-5'>之</b>九宮格密碼鎖<b class='flag-5'>功能</b><b class='flag-5'>實現(xiàn)</b>