在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

三種自定義彈窗UI組件封裝的實現

OpenHarmony技術社區 ? 來源:HarmonyOS技術社區 ? 作者:HarmonyOS技術社區 ? 2022-03-30 09:28 ? 次閱讀
鴻蒙已經提供了全局 UI 方法自定義彈窗,本文是基于基礎的自定義彈窗來實現提示消息彈窗、確認彈窗、輸入彈窗的 UI 組件封裝。

消息確認彈窗


首先看下效果:


2c5e3360-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個新的組件 ConfirmDialog

@CustomDialog
exportdefaultstructConfirmDialog{
title:string=''
content:string=''
confirmFontColor:string='#E84026'
cancelFontColor:string='#0A59F7'
confirmText:string='確認'
cancelText:string='取消'
controller:CustomDialogController
cancel:()=>void
confirm:()=>void
build(){}
}
自定義確認彈窗可自定義傳入的參數有:
  • 可選參數標題 title(默認值:“”),正文內容 content(默認值:“”),確認按鈕字體顏色 confirmFontColor(默認值:#E84026),取消按鈕字體顏色 cancelFontColor(默認值:#0A59F7),確認按鈕文案(默認值:確認),取消按鈕文案(默認值:取消)

  • 必須參數自定義彈窗控制器 controller: CustomDialogController,確認按鈕觸發事件 confirm(),取消按鈕觸發事件 cancel()

標題、正文、按鈕封裝:一個確認彈窗組件主要由標題、正文等文本內容和取消、確認等按鈕事件組成。下面將分別對文案和按鈕通過**@Extend**裝飾器進行封裝。

@Extend 裝飾器將新的屬性函數添加到內置組件上,如 Text、Column、Button 等。通過**@Extend**裝飾器可以快速定義并復用組件的自定義樣式。

2c77f5d4-af49-11ec-aa7f-dac502259ad0.png

//標題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}

//取消、確認按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}

本示例僅標題與正文僅支持字體大小 fontSize 自定義,按鈕僅支持按鈕文案字體顏色 fontColor 自定義,其他通用屬性皆是寫定的,若想支持其他屬性自定義,也可通過 fancfontSize() 添加新的參數。

其次,可以更進一步的對標題與正文通過 @Builder 裝飾器進行封裝,且通過是否傳入 title、content 字段來判斷是否展示對應文案。

@Builder 裝飾的方法用于定義組件的聲明式 UI 描述,在 一個自定義組件內快速生成多個布局內容。@Builder 裝飾方法的功能和語法規范與build 函數相同。

//文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

注意:
  • @Extend 裝飾器的內容必須寫在 ConfirmDialog{} 組件外,且在 @Extend 裝飾器聲明的基礎內置組件的方法之前不能出現用/*多行注釋(會報錯),但可采用單行注釋//。

  • @Builder 裝飾器的內容要寫在 ConfirmDialog{} 組件內,build(){} 外 。

  • @Builder 裝飾器聲明的自定義組件內部可包含 @Extend 聲明的自定義樣式的基礎組件,但是 @Extend 內部不可包含 @Builder 裝飾器聲明的自定義組件。

ConfirmDialog 組件完整代碼:

//取消、確認按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
//標題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}
@CustomDialog
exportdefaultstructConfirmDialog{
title:string=''
content:string=''
confirmFontColor:string='#E84026'
cancelFontColor:string='#0A59F7'
confirmText:string='確認'
cancelText:string='取消'
controller:CustomDialogController
cancel:()=>void
confirm:()=>void
//標題、正文文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle(this.title,28)
this.TipTextStyle(this.content,22)
Flex({justifyContent:FlexAlign.SpaceAround}){
Text(this.cancelText)
.fancBtn(this.cancelFontColor)
.onClick(()=>{
this.controller.close()
this.cancel()
})
Text(this.confirmText)
.fancBtn(this.confirmFontColor)
.onClick(()=>{
this.controller.close()
this.confirm()
})
}.margin({top:30,bottom:16,left:16,right:16})
}
}
}

引用頁面代碼:

importConfirmDialogfrom'./components/dialog/ConfirmDialog.ets'
@Entry
@Component
structIndexComponent{
//確認彈窗
privatetitle:string='標題'
privatecontent:string='此操作將永久刪除該文件,是否繼續?'
privateconfirmText:string='刪除'
ConfirmDialogController:CustomDialogController=newCustomDialogController({
builder:ConfirmDialog({cancel:this.onCancel,confirm:()=>{
this.onAccept()
},title:this.title,content:this.content}),
cancel:this.onCancel,
autoCancel:true
})
//點擊取消按鈕或遮罩層關閉彈窗
onCancel(){
console.info('取消,關閉彈窗')
}
//點擊確認彈窗
onAccept(){
console.info('確認,關閉彈窗')
}
build(){
Scroll(){
Column(){
Text('確認彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.ConfirmDialogController.open()
})
}
.width('100%')
}
}
}

消息提示彈窗

首先看下效果:

2c88cdf0-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個新的組件 PromptDialog:

@CustomDialog
exportdefaultstructPromptDialog{
controller:CustomDialogController
ancel:()=>void
build(){}
}
至于標題、正文、按鈕文案及按鈕顏色的封裝均與消息確認彈窗一樣,同 1.2 所述。

PromptDialog 組件完整代碼:

//標題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Center)
.padding({top:15,bottom:0,left:8,right:8})
.alignSelf(ItemAlign.Center)
.margin({top:16})
}
//底部按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.backgroundColor(0xffffff)
.fontColor(fontColor)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
@CustomDialog
exportdefaultstructPromptDialog{
controller:CustomDialogController
cancel:()=>void
//標題、正文文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle($s('strings.title'),28)
this.TipTextStyle($s('strings.content'),22)
Flex({justifyContent:FlexAlign.Center}){
Text($s('strings.confirm'))
.fancBtn(0x0A59F7)
.onClick(()=>{
this.controller.close()
})
}.margin({top:30,bottom:16})
}
}
}

若標題 title 與正文 content 中的文案是固定的,可如此示例一樣,可采用寫入到 resource 中的 zh_CN 和 en_US 文件中,通過 $s(‘strings.title’) 取值顯示,若是動態獲取的,可采用消息確認彈窗中傳參方式。

2c993730-af49-11ec-aa7f-dac502259ad0.png

引用頁面代碼:

importPromptDialogfrom'./components/dialog/PromptDialog.ets'
@Entry
@Component
structIndexComponent{
//消息提示彈窗
PromptDialogController:CustomDialogController=newCustomDialogController({
builder:PromptDialog(),
autoCancel:true
})

build(){
Scroll(){
Column(){
Text('消息提示彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.PromptDialogController.open()
})
}
.width('100%')
}
}
}

消息輸入彈窗

首先看下效果:

2cbbc26e-af49-11ec-aa7f-dac502259ad0.png

首先先定義一個新的組件 InputDialog:

exportdefaultstructInputDialog{
title:string=''
content:string=''
@StateinputString:string=''
controller:CustomDialogController
cancel:()=>void
confirm:(data)=>void

build(){}
}
此示例講述了子組件通過事件觸發傳參給父組件的方法,例如:在子組件用 @state 聲明輸入框內容 inputString,通過 confirm 事件傳參給父組件,可支持在父組件至于標題、正文、按鈕文案及按鈕顏色的封裝均與消息確認彈窗一樣,同 1.2 所述。

PromptDialog 組件完整代碼:

//取消、確認按鈕自定義樣式
@Extend(Text)functionfancBtn(fontColor:string){
.fontColor(fontColor)
.backgroundColor(0xffffff)
.width(188)
.height(29)
.fontSize(22)
.textAlign(TextAlign.Center)
}
//標題title與正文content自定義樣式
@Extend(Text)functionfancfontSize(fontSize:number){
.fontSize(fontSize)
.width('100%')
.fontColor('rgba(0,0,0,0.86)')
.textAlign(TextAlign.Start)
.padding({top:15,bottom:0,left:15,right:15})
.margin({top:16})
}
@CustomDialog
exportdefaultstructInputDialog{
title:string=''
content:string=''
@StateinputString:string=''
controller:CustomDialogController
cancel:()=>void
confirm:(data)=>void
//文案樣式
@BuilderTipTextStyle(tip:string,fontSize:number){
Text(tip)
.fancfontSize(fontSize)
.visibility(tip.length>0?Visibility.Visible:Visibility.None)
}

build(){
Column(){
this.TipTextStyle(this.title,28)
this.TipTextStyle(this.content,22)
//輸入框
TextInput()
.type(InputType.Normal)
.enterKeyType(EnterKeyType.Next)
.caretColor(Color.Green)
.height(44)
.margin({top:20,left:15;right:15})
.alignSelf(ItemAlign.Center)
.onChange((value:string)=>{
this.inputString=value
})
Flex({justifyContent:FlexAlign.SpaceAround}){
Text($s('strings.cancel'))
.fancBtn('#0A59F7')
.onClick(()=>{
this.controller.close()
this.cancel()
})
Text($s('strings.confirm'))
.fancBtn('#E84026')
.onClick(()=>{
this.controller.close()
console.log('inputString:'+this.inputString)
this.confirm(this.inputString)
})
}.margin({top:30,bottom:16,left:16,right:16})
}
}
}
2cd4ba08-af49-11ec-aa7f-dac502259ad0.png

引用頁面代碼:

importInputDialogfrom'./components/dialog/InputDialog.ets'
@Entry
@Component
structIndexComponent{

//輸入彈窗
privatetext:string='提示'
privatelabel:string='請輸入您的姓名'
InputDialogController:CustomDialogController=newCustomDialogController({
builder:InputDialog({cancel:this.onCancel,confirm:(data)=>{
this.confirm(data)
},title:this.text,content:this.label}),
cancel:this.onCancel,
autoCancel:true
})
//點擊取消按鈕或遮罩層關閉彈窗
onCancel(){
console.info('取消,關閉輸入彈窗')
}
//點擊確認彈窗
confirm(data){
console.info('確認,關閉輸入彈窗,data:'+data)
}

build(){
Scroll(){
Column(){
Text('輸入彈窗')
.fontSize(24)
.width(300)
.height(60)
.border({width:5,color:0x317AF7,radius:10,style:BorderStyle.Solid})
.margin({top:20,bottom:10})
.textAlign(TextAlign.Center)
.onClick(()=>{
this.InputDialogController.open()
})
}
.width('100%')
}
}
}

總結

本文僅僅實現了三種自定義彈窗 UI 組件的封裝(傳參方式也講解了多種,具體傳參方式可視具體情況而定),待筆者優化了功能、代碼后在來與大家分享, 在最后歡迎鴻蒙各位大佬指教。

原文標題:在鴻蒙上實現3種自定義彈窗UI組件封裝

文章出處:【微信公眾號:HarmonyOS技術社區】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 封裝
    +關注

    關注

    126

    文章

    7901

    瀏覽量

    142951
  • 組件
    +關注

    關注

    1

    文章

    512

    瀏覽量

    17823
  • 鴻蒙
    +關注

    關注

    57

    文章

    2351

    瀏覽量

    42850

原文標題:在鴻蒙上實現3種自定義彈窗UI組件封裝

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發實例:【自定義Emitter】

    使用[Emitter]實現事件的訂閱和發布,使用[自定義彈窗]設置廣告信息。
    的頭像 發表于 04-14 11:37 ?1002次閱讀
    HarmonyOS開發實例:【<b class='flag-5'>自定義</b>Emitter】

    HarmonyOS開發案例:【彈窗使用】

    基于dialog和button組件實現彈窗的幾種自定義效果
    的頭像 發表于 04-25 17:44 ?1383次閱讀
    HarmonyOS開發案例:【<b class='flag-5'>彈窗</b>使用】

    HarmonyOS開發案例:【 自定義彈窗

    基于ArkTS的聲明式開發范式實現三種不同的彈窗,第一直接使用公共組件,后兩使用Custo
    的頭像 發表于 05-16 18:18 ?1370次閱讀
    HarmonyOS開發案例:【 <b class='flag-5'>自定義</b><b class='flag-5'>彈窗</b>】

    HarmonyOS實戰開發-全局彈窗封裝案例

    介紹 本示例介紹兩彈窗封裝案例。一自定義彈窗封裝
    發表于 05-08 15:51

    HarmonyOS實戰開發-深度探索與打造個性化自定義組件

    ,容器組件,媒體組件,繪制組件,畫布組件組件等,如Button、Text 是基礎組件。 由開發者
    發表于 05-08 16:30

    OpenHarmony應用開發之自定義彈窗

    以??橘子購物??中一個應用更新提示的彈窗介紹OpenHarmony的自定義彈窗。 接口 自定義彈窗官方文檔:??
    發表于 09-06 14:40

    OpenHarmony自定義組件介紹

    代碼可復用性、業務邏輯與UI分離,后續版本演進等因素。因此,將UI和部分業務邏輯封裝自定義組件是不可或缺的能力。
    發表于 09-25 15:36

    深度解讀HarmonyOS自定義UI組件的使用

    。 Component 是繪制在屏幕上的一個對象,用戶能與之交互。Java UI框架提供了創建UI界面的各類組件,比如:文本、按鈕、圖片、列表等。每個組件通過對數據和方法的簡單
    的頭像 發表于 09-16 09:30 ?1852次閱讀
    深度解讀HarmonyOS<b class='flag-5'>自定義</b><b class='flag-5'>UI</b><b class='flag-5'>組件</b>的使用

    鴻蒙上自定義組件的過程

    特性的組件,通過擴展 Component 或其子類實現,可以精確控制屏幕元素的外觀,實現開發者想要達到的效果,也可響應用戶的點擊、觸摸、長按等操作。 ? 下面通過自定義一個仿微信朋友圈
    的頭像 發表于 11-10 09:27 ?2901次閱讀
    鴻蒙上<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>的過程

    OpenHarmony自定義組件FlowImageLayout

    組件介紹 本示例是OpenHarmony自定義組件FlowImageLayout。 用于將一個圖片列表以瀑布流的形式顯示出來。 調用方法
    發表于 03-21 10:17 ?3次下載
    OpenHarmony<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>FlowImageLayout

    OpenHarmony自定義組件CircleProgress

    組件介紹 本示例是OpenHarmony自定義組件CircleProgress。 用于定義一個帶文字的圓形進度條。 調用方法
    發表于 03-23 14:06 ?4次下載
    OpenHarmony<b class='flag-5'>自定義</b><b class='flag-5'>組件</b>CircleProgress

    適用于鴻蒙的自定義組件框架Carbon案例教程

    項目名稱:Carbon 所屬系列:ohos的第組件適配移植 功能:一個適用于鴻蒙的自定義組件框架,幫助快速實現各種需要的效果 項目移植狀
    發表于 04-07 09:49 ?5次下載

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖b
    發表于 04-08 10:48 ?14次下載

    ArkUI如何自定義彈窗(eTS)

    自定義彈窗其實也是比較簡單的,通過CustomDialogController類就可以顯示自定義彈窗
    的頭像 發表于 08-31 08:24 ?2199次閱讀

    鴻蒙ArkUI實例:【自定義組件

    組件是 OpenHarmony 頁面最小顯示單元,一個頁面可由多個組件組合而成,也可只由一個組件組合而成,這些組件可以是ArkUI開發框架自帶系統
    的頭像 發表于 04-08 10:17 ?642次閱讀
    主站蜘蛛池模板: 高h水果榨汁play男男| 婷婷丁香在线观看| 天天射综合| 黄色欧美视频| 日本加勒比在线精品视频| 一级美女片| 色偷偷视频| 99成人| 在线黄| 四虎黄色| 91久娇草| 亚洲综合在线一区| 日本三级在线播放线观看2021| aⅴ一区二区三区| 美女 免费 视频 黄的| 人人干天天操| 色女人综合| 美女爱爱网站| 狠狠干夜夜操| 亚洲欧美人成网站综合在线| 狠狠色丁香九九婷婷综合五月| www.a级片| 午夜黄视频| 色l情视频| 天天插天天干| 综合五月婷婷| 国产精品四虎在线观看免费| 91久久天天躁狠狠躁夜夜| 四虎成人免费网站在线| aaa一级最新毛片| 亚洲欧美色一区二区三区| 欧美午夜影视| 国产―笫一页―浮力影院xyz | 日韩色天使综合色视频| 午夜视频在线观看网站| 精品一区二区三区在线视频| 国产性片在线观看| 国产h视频在线观看| 免费观看a黄一级视频| 国产午夜精品久久久久九九| 四虎最新网址|