欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android+Flutter實(shí)現(xiàn)文字跑馬燈特效

 更新時(shí)間:2022年11月30日 11:13:42   作者:WeninerIo  
跑馬燈常常被運(yùn)用在很多領(lǐng)域, 例如商場(chǎng)的電子條幅、大樓的宣傳廣告位、地鐵的廣告位。今天我們來(lái)說(shuō)一下flutter 怎么通過(guò)繪制來(lái)實(shí)現(xiàn)跑馬燈效果!,希望對(duì)大家有所幫助

跑馬燈被運(yùn)用在很多領(lǐng)域, 例如商場(chǎng)的電子條幅、大樓的宣傳廣告位、地鐵的廣告位.不過(guò)毫無(wú)疑問(wèn)的是它們都是為了解決文字過(guò)長(zhǎng)的問(wèn)題而應(yīng)景給出的一種解決方案.

今天我們來(lái)說(shuō)一下flutter 怎么通過(guò)繪制來(lái)實(shí)現(xiàn)跑馬燈效果! 等不及想看源碼的兄弟們,請(qǐng)走這里:https://github.com/weniner/flutter_demo/blob/main/lib/text_effects/widget/marquee_effect.dart

分析實(shí)現(xiàn)

我們都知道跑馬燈是不停的往前跑. 在給定的區(qū)域里,如果是最小的繪制區(qū)域,我們也至少繪制出它左邊剛出頭,右邊剛出尾的所有子項(xiàng).同時(shí)我們也需要一個(gè)東西來(lái)驅(qū)動(dòng)它去前行.

同時(shí),文字也會(huì)有很多情況.

它可能很短,也可能和給定的的區(qū)域相等,也可能遠(yuǎn)超我們給定的區(qū)域. 在這種情況下,我們應(yīng)該首先獲取文字的寬度.然后確定每秒它會(huì)移動(dòng)多少.并且還需要一個(gè)驅(qū)動(dòng)器來(lái)驅(qū)動(dòng)它去做這些變化.

測(cè)量文字

如果大家寫(xiě)過(guò)Flutter, 一定用過(guò)Text Widget. 既然Text Widget 可以根據(jù)文字大小來(lái)展示,說(shuō)明Flutter中是有一個(gè)api可以測(cè)量文字長(zhǎng)寬的.這里直接給出答案:

// 我們最終繪制的文字
final String kText = 'Flutter 文字特效之跑馬燈';
{
    // 需要被測(cè)量的文字 Widget
    TextSpan measureText =
        TextSpan(text: kText, style: const TextStyle(color: Colors.black));
    TextPainter _painter = TextPainter(
      text: measureText,
      textDirection: TextDirection.ltr,
      // 這里定義最大為1行
      maxLines: 1,
      // 這里給定文字繪制的約束最小為0.0, 最大不限制.從而獲取真實(shí)的文字寬高
    )..layout(minWidth: 0.0, maxWidth: double.infinity);
}

其中,TextPainter便包含了我們需要的文字寬高.我們創(chuàng)建一個(gè)對(duì)象去保存這個(gè)信息,方便 后面去繪制.

// 這里繼承里ChangeNotifier, 可以讓我們以最小的代價(jià)刷新界面
class _TextInfo extends ChangeNotifier {
  // 繪制時(shí)最前面的文字偏移
  double head = 0.0;

  double width;

  double margin;

  _TextInfo(this.width, this.margin);

  // speed是我們定義的偏移速度,
  // 這里與我們的偏移量息息相關(guān)
  void update(double speed) {
    // 首先先讓偏移量自減
    head -= speed;
    // 如果超過(guò)了文字大小和間距的總長(zhǎng)度,說(shuō)明當(dāng)前的文字已經(jīng)超出了屏幕.
    // 我們應(yīng)該用緊接著下一條數(shù)據(jù)的偏移量賦值.
    if (head < -width - margin) {
      head += width + margin;
    }
    notifyListeners();
  }
}

動(dòng)畫(huà)為媒

文字測(cè)量完后, 我們還需要一個(gè)可以驅(qū)動(dòng)文字移動(dòng)的驅(qū)動(dòng)器. 這里你可以通過(guò)ticker自己實(shí)現(xiàn)一個(gè)驅(qū)動(dòng). 我們?yōu)榱撕?jiǎn)單化考慮, 沒(méi)錯(cuò)~ 我們又要請(qǐng)出我們的好兄弟AnimationController重出江湖了

實(shí)際上這里運(yùn)用不了太多AnimationController的參數(shù),我們唯一需要在乎的就是Duration, 也就是時(shí)間越短.我們將跑的越快.時(shí)間越長(zhǎng),跑的越慢.可以說(shuō)是反比關(guān)系.

{
    AnimationController _scrollController =
        AnimationController(vsync: this, duration: const Duration(seconds:1));
}

最終繪制

萬(wàn)事俱備,只欠東風(fēng). 像一個(gè)方程, 我們所有的未知數(shù)都有了解. 只剩下最后求y了. 這里我們通過(guò)CustomPainter來(lái)繪制文字. 我們之前通過(guò)創(chuàng)建自己的類(lèi)保存了文字信息,同時(shí)讓它繼承了ChangeNotifier就是為了今朝.

  _RevolvingLanternPainter(
    this.painter,
    this.textInfo,
  ) : super(repaint: textInfo);

我們將CustomPainter的repaint參數(shù)賦值成我們自己定義的類(lèi). 每次我們update() 都會(huì)通知界面來(lái)刷新,從而不會(huì)影響別的界面, 只影響當(dāng)前的繪制畫(huà)布. 然后, 我們就可以去真正的繪制啦~ 這里我們唯一需要做的,就是給一個(gè)值x記錄下所有文字的偏移量. 如果偏移量大于當(dāng)前的界面. 說(shuō)明它不在界面上, 也就不用繪制啦!

    @override
    void paint(Canvas canvas, Size size) {
        double x = textInfo.head;
        while (x < size.width) {
            painter.paint(canvas, Offset(x, 0.0));
            x += textInfo.width + textInfo.margin;
        }
    }

通過(guò)這種方法, 我們實(shí)現(xiàn)了跑馬燈文字的繪制~~

源碼:https://github.com/weniner/flutter_demo/blob/main/lib/text_effects/widget/marquee_effect.dart

到此這篇關(guān)于Android+Flutter實(shí)現(xiàn)文字跑馬燈特效的文章就介紹到這了,更多相關(guān)Android Flutter文字跑馬燈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android中使用GridLayout網(wǎng)格布局來(lái)制作簡(jiǎn)單的計(jì)算器App

    Android中使用GridLayout網(wǎng)格布局來(lái)制作簡(jiǎn)單的計(jì)算器App

    這篇文章主要介紹了Android中使用GridLayout網(wǎng)格布局來(lái)制作簡(jiǎn)單的計(jì)算器App的實(shí)例,GridLayout比表格布局TabelLayout更容易用來(lái)制作計(jì)算器這樣的多按鈕排列的界面,需要的朋友可以參考下
    2016-04-04
  • Android中引用其他程序的文本資源超簡(jiǎn)單方法

    Android中引用其他程序的文本資源超簡(jiǎn)單方法

    這篇文章主要介紹了Android中引用其他程序的文本資源超簡(jiǎn)單方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-01-01
  • android計(jì)算器簡(jiǎn)單實(shí)現(xiàn)代碼

    android計(jì)算器簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了android計(jì)算器的簡(jiǎn)單實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android通過(guò)原生APi獲取所在位置的經(jīng)緯度

    Android通過(guò)原生APi獲取所在位置的經(jīng)緯度

    本篇文章主要介紹了Android通過(guò)原生APi獲取所在位置的經(jīng)緯度,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Android星級(jí)評(píng)分條實(shí)現(xiàn)評(píng)分界面

    Android星級(jí)評(píng)分條實(shí)現(xiàn)評(píng)分界面

    這篇文章主要為大家詳細(xì)介紹了Android星級(jí)評(píng)分條實(shí)現(xiàn)評(píng)分界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解Flutter中l(wèi)istview的高級(jí)用法

    詳解Flutter中l(wèi)istview的高級(jí)用法

    一般我們使用Listview的方式是構(gòu)建要展示的item,然后將這些item傳入ListView的構(gòu)造函數(shù)即可,通常情況下這樣做是夠用了,但是不排除我們會(huì)有一些其他的特殊需求。今天我們會(huì)來(lái)講解一下ListView的一些高級(jí)用法,希望對(duì)大家有所幫助
    2023-01-01
  • Input系統(tǒng)截?cái)嗖呗缘姆治雠c應(yīng)用詳解

    Input系統(tǒng)截?cái)嗖呗缘姆治雠c應(yīng)用詳解

    這篇文章主要為大家介紹了Input系統(tǒng)截?cái)嗖呗缘姆治雠c應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 圖文詳解Flutter單例的實(shí)現(xiàn)

    圖文詳解Flutter單例的實(shí)現(xiàn)

    一個(gè)類(lèi)只允許創(chuàng)建一個(gè)實(shí)例,那這個(gè)類(lèi)就是一個(gè)單例類(lèi),這種設(shè)計(jì)模式就叫作單例設(shè)計(jì)模式,簡(jiǎn)稱(chēng)單例模式,下面這篇文章主要給大家介紹了關(guān)于Flutter單例的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12
  • Android獲取SDcard目錄及創(chuàng)建文件夾的方法

    Android獲取SDcard目錄及創(chuàng)建文件夾的方法

    今天小編就為大家分享一篇Android獲取SDcard目錄及創(chuàng)建文件夾的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Android中通過(guò)Notification&NotificationManager實(shí)現(xiàn)消息通知

    Android中通過(guò)Notification&NotificationManager實(shí)現(xiàn)消息通知

    關(guān)于通知Notification相信大家都不陌生了,平時(shí)上QQ的時(shí)候有消息來(lái)了或者有收到了短信,手機(jī)頂部就會(huì)顯示有新消息什么的,就類(lèi)似這種。今天就稍微記錄下幾種Notification的用法。3.0以前的通知和3.0以后的通知是有些區(qū)別的。
    2015-10-10

最新評(píng)論