HarmonyOS NEXT應用開發(fā)之深色跑馬燈案例

介紹

本示例介紹了文本寬度過寬時,如何實現(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)琢融。

  1. 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%')
  1. 頁面進來執(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)日志的打印熬苍、資源 的調用稍走。

參考資料

顯示動畫animateTo

數(shù)據(jù)懶加載LazyForEach

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婿脸,更是在濱河造成了極大的恐慌邑贴,老刑警劉巖念恍,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡匆浙,警方通過查閱死者的電腦和手機准颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門美浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尽棕,“玉大人,你說我怎么就攤上這事味赃∠颇ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵心俗,是天一觀的道長傲武。 經(jīng)常有香客問我,道長城榛,這世上最難降的妖魔是什么揪利? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮狠持,結果婚禮上疟位,老公的妹妹穿的比我還像新娘。我一直安慰自己喘垂,他們只是感情好甜刻,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著正勒,像睡著了一般得院。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上章贞,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天祥绞,我揣著相機與錄音,去河邊找鬼鸭限。 笑死就谜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的里覆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缆瓣,長吁一口氣:“原來是場噩夢啊……” “哼喧枷!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隧甚,失蹤者是張志新(化名)和其女友劉穎车荔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戚扳,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡忧便,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帽借。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珠增。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砍艾,靈堂內的尸體忽然破棺而出蒂教,到底是詐尸還是另有隱情,我是刑警寧澤脆荷,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布凝垛,位于F島的核電站,受9級特大地震影響蜓谋,放射性物質發(fā)生泄漏梦皮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一桃焕、第九天 我趴在偏房一處隱蔽的房頂上張望剑肯。 院中可真熱鬧,春花似錦覆旭、人聲如沸退子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂祥。三九已至,卻和暖如春七兜,著一層夾襖步出監(jiān)牢的瞬間丸凭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工腕铸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惜犀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓狠裹,卻偏偏與公主長得像虽界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涛菠,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容