介紹 本示例介紹了文本寬度過寬時,如何實現文本首尾相接迴圈滾動並顯示在可視區,以及每迴圈滾動一次之後會停滯一段時間後再滾動。 效果圖預覽 使用說明: 1.進入頁面,檢票口文本處,實現文本首尾相接迴圈滾動,且在同一可視區,滾動完成之後,停滯一段時間後繼續滾動。 實現思路 由於ArkUI中的Marque ...
介紹
本示例介紹了文本寬度過寬時,如何實現文本首尾相接迴圈滾動並顯示在可視區,以及每迴圈滾動一次之後會停滯一段時間後再滾動。
效果圖預覽
使用說明:
1.進入頁面,檢票口文本處,實現文本首尾相接迴圈滾動,且在同一可視區,滾動完成之後,停滯一段時間後繼續滾動。
實現思路
由於ArkUI中的Marquee組件無法實現文本接替並顯示在同一可視區的效果,它只能等文本完全消失在可視區之後,才會再次顯示在可視區, 因此需要以下方案實現。
- Text組件外層包裹一層Scroll組件,Scroll組件設置一定的百分比寬度值,並獲取當前文本內容寬度和Scroll組件寬度,文本寬度大於 Scroll組件寬度時,通過添加判斷顯示同樣的文本,在偏移過程中可實現文本接替並顯示在同一顯示區的效果。源碼參考Marquee.ets
// TODO:知識點:使用Scroll組件和文本內容組件結合來判斷文本寬度過寬時執行文本滾動,否則不執行
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組件寬度時顯示。在偏移過程中可實現文本接替並顯示在同一顯示區的效果
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%')
- 頁面進來執行文本滾動函數scrollAnimation(),在指定的時間內完成文本的偏移,當迴圈一次之後,通過定時器setTimeout 來實現停滯操作。源碼參考Marquee.ets
// 文本滾動函數
scrollAnimation() {
// 文本寬度小於Scroll組件寬度,不執行滾動操作
if (this.ticketCheckTextWidth < this.ticketCheckScrollWidth) {
return;
}
/**
* 文本向左偏移動畫
*
* @param duration:動畫總時長
* @param curve:動畫曲線
* @param delay:延遲時間
* @param onFinish:完成回調函數
* 性能:播放動畫時,系統需要在一個刷新周期內完成動畫變化曲線的計算,完成組件佈局繪製等操作。建議使用系統提供的動畫介面,
* 只需設置曲線類型、終點位置、時長等信息,就能夠滿足常用的動畫功能,減少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之後重新執行動畫函數,達到停滯操作。
setTimeout(() => {
// 初始化文本偏移量
this.ticketCheckTextOffset = 0;
this.scrollAnimation();
}, Constants.DELAY_TIME)
}
}, () => {
// 文本偏離量
this.ticketCheckTextOffset = -(this.ticketCheckTextWidth + Constants.BLANK_SPACE)
})
}
高性能知識點
本示例使用了LazyForEach 進行數據懶載入,動態添加行程信息以及顯示動畫animateTo實現文本偏移。
工程結構&模塊類型
marquee // har類型
|---model
| |---Constants.ets // 數據模型層-常量
| |---DataSource.ets // 模型層-懶載入數據源
| |---DataType.ets // 數據模型層-數據類型
| |---MockData.ets // 數據模型層-模擬數據
|---view
| |---Marquee.ets // 視圖層-應用主頁面