介紹
本示例介紹了文本寬度過寬時,如何實現(xiàn)文本首尾相接循環(huán)滾動并顯示在可視區(qū)畦木,以及每循環(huán)滾動一次之后會停滯一段時間后再滾動袖扛。
效果圖預覽
使用說明:
1.進入頁面,檢票口文本處,實現(xiàn)文本首尾相接循環(huán)滾動蛆封,且在同一可視區(qū)唇礁,滾動完成之后,停滯一段時間后繼續(xù)滾動惨篱。
實現(xiàn)思路
由于ArkUI中的Marquee組件無法實現(xiàn)文本接替并顯示在同一可視區(qū)的效果盏筐,它只能等文本完全消失在可視區(qū)之后,才會再次顯示在可視區(qū)砸讳, 因此需要以下方案實現(xiàn)琢融。
- Text組件外層包裹一層Scroll組件,Scroll組件設置一定的百分比寬度值簿寂,并獲取當前文本內容寬度和Scroll組件寬度漾抬,文本寬度大于 Scroll組件寬度時,通過添加判斷顯示同樣的文本常遂,在偏移過程中可實現(xiàn)文本接替并顯示在同一顯示區(qū)的效果纳令。源碼參考Marquee.ets
// TODO:知識點:使用Scroll組件和文本內容組件結合來判斷文本寬度過寬時執(zhí)行文本滾動,否則不執(zhí)行
Scroll() {
Row() {
Text(this.tripDataItem.ticketEntrance)
.onAreaChange((oldValue, newValue) => {
logger.info(`TextArea oldValue:${JSON.stringify(oldValue)},newValue:${JSON.stringify(newValue)}`);
// 獲取當前文本內容寬度
this.ticketCheckTextWidth = Number(newValue.width);
})
// TODO:知識點:文本寬度大于Scroll組件寬度時顯示烈钞。在偏移過程中可實現(xiàn)文本接替并顯示在同一顯示區(qū)的效果
if (this.ticketCheckTextWidth >= this.ticketCheckScrollWidth) {
Blank()
.width(50)
Text(this.tripDataItem.ticketEntrance)
}
}.offset({ x: this.ticketCheckTextOffset })
}
.width('50%')
.align(Alignment.Start)
.enableScrollInteraction(false)
.flexGrow(1)
.scrollable(ScrollDirection.Horizontal)
.scrollBar(BarState.Off)
.onAreaChange((oldValue, newValue) => {
logger.info(`scrollArea oldValue:${JSON.stringify(oldValue)},newValue:${JSON.stringify(newValue)}`);
// 獲取當前Scroll組件寬度
this.ticketCheckScrollWidth = Number(newValue.width);
})
}
.width('46%')
- 頁面進來執(zhí)行文本滾動函數(shù)scrollAnimation()泊碑,在指定的時間內完成文本的偏移,當循環(huán)一次之后毯欣,通過定時器setTimeout 來實現(xiàn)停滯操作馒过。源碼參考Marquee.ets
// 文本滾動函數(shù)
scrollAnimation() {
// 文本寬度小于Scroll組件寬度,不執(zhí)行滾動操作
if (this.ticketCheckTextWidth < this.ticketCheckScrollWidth) {
return;
}
/**
* 文本向左偏移動畫
*
* @param duration:動畫總時長
* @param curve:動畫曲線
* @param delay:延遲時間
* @param onFinish:完成回調函數(shù)
* 性能:播放動畫時酗钞,系統(tǒng)需要在一個刷新周期內完成動畫變化曲線的計算腹忽,完成組件布局繪制等操作。建議使用系統(tǒng)提供的動畫接口砚作,
* 只需設置曲線類型窘奏、終點位置、時長等信息葫录,就能夠滿足常用的動畫功能着裹,減少UI主線程的負載。
* 參考資料:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-attribute-animation-apis-0000001820879805
*/
animateTo({
duration: Constants.ANIMATION_DURATION,
curve: Curve.Linear,
delay: this.delay,
onFinish: () => {
// TODO:知識點:動畫完成時米同,添加定時器骇扇,1s之后重新執(zhí)行動畫函數(shù),達到停滯操作面粮。
setTimeout(() => {
// 初始化文本偏移量
this.ticketCheckTextOffset = 0;
this.scrollAnimation();
}, Constants.DELAY_TIME)
}
}, () => {
// 文本偏離量
this.ticketCheckTextOffset = -(this.ticketCheckTextWidth + Constants.BLANK_SPACE)
})
}
高性能知識點
本示例使用了LazyForEach 進行數(shù)據(jù)懶加載少孝,動態(tài)添加行程信息以及顯示動畫animateTo實現(xiàn)文本偏移。
工程結構&模塊類型
marquee // har類型
|---model
| |---Constants.ets // 數(shù)據(jù)模型層-常量
| |---DataSource.ets // 模型層-懶加載數(shù)據(jù)源
| |---DataType.ets // 數(shù)據(jù)模型層-數(shù)據(jù)類型
| |---MockData.ets // 數(shù)據(jù)模型層-模擬數(shù)據(jù)
|---view
| |---Marquee.ets // 視圖層-應用主頁面
模塊依賴
本實例依賴common模塊來實現(xiàn)日志的打印熬苍、資源 的調用稍走。