UI界面是應(yīng)用程序可視化必不可少的部分。設(shè)計(jì)精致的UI界面可以使得整個(gè)可視化應(yīng)用程序給用戶(hù)留下深刻的印象,是改善用戶(hù)界面體驗(yàn)最直接的方式。
ArkUI開(kāi)發(fā)框架為開(kāi)發(fā)者提供了豐富的UI原生組件,如Navigation(Page頁(yè)面的根容器)、ScrollBar(滾動(dòng)條組件)、Swiper(滑動(dòng)容器)及Tabs(通過(guò)頁(yè)簽進(jìn)行內(nèi)容視圖切換的容器組件)等。其中,Swiper組件和Tabs組件在應(yīng)用程序開(kāi)發(fā)中對(duì)于指示器的使用引入較多,但是直接使用原生的Swiper組件和Tabs組件不適用于表現(xiàn)復(fù)雜的UI指示器交互變化。因此,我們針對(duì)Swiper組件和Tabs組件在指示器應(yīng)用方向做了一個(gè)簡(jiǎn)單的封裝,以CiecleIndicator三方組件的形式提供應(yīng)用程序依賴(lài)使用,從而提升了ArkUI開(kāi)發(fā)框架的UI界面之指示器風(fēng)格多樣化的能力。
CircleIndicator介紹
CircleIndicator組件UI效果展示
圓形指示器:長(zhǎng)條指示器:
橫幅指示器:
三角指示器:
圖標(biāo)指示器:
攜帶中央視圖的Tabs指示器:
固定位置Tabs指示器:
固定位置Tabs指示器(膠囊風(fēng)格):
固定位置Tabs指示器(攜帶角標(biāo)):
可滑動(dòng)Tabs指示器:
可滑動(dòng)Tabs指示器(水滴滑塊):
可滑動(dòng)Tabs指示器(首列固定):
titles指示器:
什么是CircleIndicator?
CircleIndicator顧名思義,它指的是圓形指示器。不過(guò)在我們OpenHarmony三方組件中的CircleIndicator組件不再是狹義的圓形指示器,而是將多種表現(xiàn)形式的指示器匯集為一體的歸一化指示器合集組件。CircleIndicator的源碼實(shí)現(xiàn)
這里我們以CircleIndicator組件源碼中的TriangularIndicator.ets文件為源碼解析樣例對(duì)象展開(kāi)分析。首先創(chuàng)建TriangularIndicator.ets文件,使用命名空間建立TriangularIndicator初始化模型:namespace TriangularIndicator {
export class Model {
//設(shè)置指示器高度
mHeight: number = 18
//設(shè)置指示器寬度
mWidth: number = lpx2px(720)
//設(shè)置指示器背景色
mBackgroundColor: string
//字段過(guò)多,此處進(jìn)行省略
//各字段set與get方法,此處只以height字段為例
public getHeight(): number {
return this.mHeight
}
public setHeight(height: number): Model {
this.mHeight = height
return this
}
//觸摸事件攔截
onPageTouch: (event: TouchEvent, currentIndicator: number) => void
public notifyTouch(event: TouchEvent, currentIndex: number) {
this.onPageTouch(event, currentIndex)
}
//設(shè)置構(gòu)造器
private tabsController: TabsController
(tabsController: TabsController) {
this.tabsController = tabsController
}
//頁(yè)面切換監(jiān)聽(tīng)
indexChange: (itemIndex: number) => void
public setChangeListener(callback: (index: number) => void): Model{
this.indexChange = callback
return this
}
}
將TriangularIndicator應(yīng)用組件化:
最后將TriangularIndicator暴露出來(lái)供外部引用:struct TriangularIndicator {
//獲取TriangularIndicator實(shí)例
null) model: TriangularIndicator.Model = new TriangularIndicator.Model(
//初始化指示器當(dāng)前index
itemIndex: number
//設(shè)置指示器總條數(shù)
0 count: number =
//再分別實(shí)現(xiàn)itemIndexChange、aboutToAppear、onTouch、getOffset方法,此處實(shí)現(xiàn)不做展示
//再在build方法里面描述UI結(jié)構(gòu)
build() {
Column() {
Rect({ width: this.model.mWidth, height: this.model.mLineHeight }).fill(this.model.mLineColor)
Polygon()
.points(this.model.mReverse ?
[[px2vp(this.model.mWidth) / (this.count * 2) - this.model.mTriangleWidth / 2, this.model.mLineHeight - this.model.mYOffset],
[px2vp(this.model.mWidth) / (this.count * 2), this.model.mLineHeight + this.model.mTriangleHeight - this.model.mYOffset],
[px2vp(this.model.mWidth) / (this.count * 2) + this.model.mTriangleWidth / 2, this.model.mLineHeight - this.model.mYOffset]] :
[[px2vp(this.model.mWidth) / (this.count * 2) - this.model.mTriangleWidth / 2, -this.model.mYOffset],
[px2vp(this.model.mWidth) / (this.count * 2), -this.model.mTriangleHeight - this.model.mYOffset],
[px2vp(this.model.mWidth) / (this.count * 2) + this.model.mTriangleWidth / 2, -this.model.mYOffset]])
.offset(this.model.mStartInterpolator ?
{ x: px2vp(this.model.mWidth) / this.count * (this.itemIndex - this.model.mStartInterpolator.interpolate(Math.abs(this.model.offs et / this.model.mWidth)) * Math.sign(this.model.offset)),
y: 0 } :
{ x: px2vp(this.model.mWidth) / this.count * (this.itemIndex - this.model.offset / this.model.mWidth),
y: 0 })
.fill(this.model.mLineColor)
.height(this.model.mHeight)
.width(this.model.mWidth)
}.width('100%').height(this.model.mHeight)
.backgroundColor(this.model.mBackgroundColor)
}
}
export default TriangularIndicator
CircleIndicator實(shí)戰(zhàn)
創(chuàng)建項(xiàng)目
如圖所示,在DevEco Studio中新建CircleIndicator_Test項(xiàng)目,項(xiàng)目類(lèi)型選擇Application,語(yǔ)言選擇eTS,點(diǎn)擊Finish完成創(chuàng)建。創(chuàng)建工程
添加依賴(lài)
成功創(chuàng)建項(xiàng)目后,接下來(lái)就是將CircleIndicator組件下載至項(xiàng)目中。請(qǐng)?jiān)谔砑右蕾?lài)之前參考如何安裝OpenHarmony npm包(https://gitee.com/openharmony-tpc/docs/blob/master/OpenHarmony_npm_usage.md)完成OpenHarmony npm環(huán)境配置。完成OpenHarmony npm環(huán)境配置之后,在DevEco Studio的底部導(dǎo)航欄,點(diǎn)擊“Terminal”(快捷鍵Alt+F12), 鍵入命令:npm install @ohos/circle-indicator --save并回車(chē),此時(shí)CircleIndicator組件會(huì)自動(dòng)下載至項(xiàng)目中。下載完成后工程根目錄下會(huì)生成node_modules/@ohos/CircleIndicator目錄。編寫(xiě)邏輯代碼
提供多種Indicator,使用方法類(lèi)似,以TriangularIndicator為例
1.初始化:實(shí)例化TabsController和對(duì)應(yīng)的Indicator.Model 對(duì)象, 并添加number類(lèi)型成員以記錄當(dāng)前頁(yè)下標(biāo)
2.屬性設(shè)置:通過(guò)Model類(lèi)對(duì)象設(shè)置UI屬性來(lái)自定義所需風(fēng)格,也可以添加所需的回調(diào)private controller: TabsController = new TabsController()
new TriangularIndicator.Model(this.controller) model: TriangularIndicator.Model =
number=0 itemIndex:
3.界面繪制:在Tabs組件旁放置Indicator組件,注意需要關(guān)閉原生的bar。并監(jiān)聽(tīng)Tabs組件的touch事件,通知給Model類(lèi),以統(tǒng)一處理滑動(dòng)邏輯aboutToAppear() {
this.model
.setReverse(true)
.setLineHeight(4)
.setTriangleHeight(10)
.setLineColor("#e94220")
.setBackgroundColor("#eeeeee")
.setChangeListener((itemIndex) => {
console.info("change page to " + this.data[itemIndex])
})
}
本期基于OpenHarmony API8的CircleIndicator組件1.0.3(https://gitee.com/openharmony-sig/CircleIndicator/tree/1.0.3)就為大家介紹到這,歡迎大家積極參與貢獻(xiàn)。了解更多三方組件動(dòng)態(tài),請(qǐng)關(guān)注三方組件資源匯總(https://gitee.com/openharmony-tpc/tpc_resource),更多優(yōu)秀的組件等你來(lái)發(fā)現(xiàn)!build() {
Column() {
TriangularIndicator({ itemIndex: $itemIndex, count: this.data.length, model: this.model })
Tabs({ index: this.itemIndex, controller: this.controller }) {
……
}
.barWidth(0)
.onTouch((event: TouchEvent) => {
this.model.notifyTouch(event, this.itemIndex)
})
}.padding({ top: 40 })
.backgroundColor("#eeeeee")
}
-
源碼
+關(guān)注
關(guān)注
8文章
642瀏覽量
29229 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3271瀏覽量
57727
原文標(biāo)題:CircleIndicator組件,使指示器風(fēng)格更加多樣化
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論