最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

分析實現(xiàn)

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

同時,文字也會有很多情況.

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

測量文字

如果大家寫過Flutter, 一定用過Text Widget. 既然Text Widget 可以根據(jù)文字大小來展示,說明Flutter中是有一個api可以測量文字長寬的.這里直接給出答案:

// 我們最終繪制的文字
final String kText = 'Flutter 文字特效之跑馬燈';
{
    // 需要被測量的文字 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, 最大不限制.從而獲取真實的文字寬高
    )..layout(minWidth: 0.0, maxWidth: double.infinity);
}

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

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

  double width;

  double margin;

  _TextInfo(this.width, this.margin);

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

動畫為媒

文字測量完后, 我們還需要一個可以驅(qū)動文字移動的驅(qū)動器. 這里你可以通過ticker自己實現(xiàn)一個驅(qū)動. 我們?yōu)榱撕唵位紤], 沒錯~ 我們又要請出我們的好兄弟AnimationController重出江湖了

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

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

最終繪制

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

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

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

    @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;
        }
    }

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

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

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

相關(guān)文章

  • Android?LineChart繪制折線圖的示例詳解

    Android?LineChart繪制折線圖的示例詳解

    這篇文章主要為大家想想介紹了Android?RecyclerLineChart實現(xiàn)繪制折線圖的相關(guān)資料,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-03-03
  • Flutter 快速實現(xiàn)聊天會話列表效果示例詳解

    Flutter 快速實現(xiàn)聊天會話列表效果示例詳解

    這篇文章主要為大家介紹了Flutter 快速實現(xiàn)聊天會話列表效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例)

    詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例)

    這篇文章主要介紹了詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Android讀取手機通訊錄聯(lián)系人到自己項目

    Android讀取手機通訊錄聯(lián)系人到自己項目

    這篇文章主要為大家詳細介紹了Android讀取手機通訊錄聯(lián)系人到自己項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android編程中Tween動畫和Frame動畫實例分析

    Android編程中Tween動畫和Frame動畫實例分析

    這篇文章主要介紹了Android編程中Tween動畫和Frame動畫,結(jié)合實例形式較為詳細的分析了Android中Tween動畫和Frame動畫的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Android持久化技術(shù)之文件的讀取與寫入實例詳解

    Android持久化技術(shù)之文件的讀取與寫入實例詳解

    這篇文章主要介紹了Android持久化技術(shù)之文件的讀取與寫入操作,結(jié)合實例形式較為詳細的分析講述了Android持久化操作的相關(guān)技巧與具體實現(xiàn)方法,需要的朋友可以參考下
    2016-01-01
  • Android編程獲取手機后臺運行服務(wù)的方法

    Android編程獲取手機后臺運行服務(wù)的方法

    這篇文章主要介紹了Android編程獲取手機后臺運行服務(wù)的方法,涉及Android針對系統(tǒng)服務(wù)的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • Android擴大View點擊范圍的方法

    Android擴大View點擊范圍的方法

    Android4.0設(shè)計規(guī)定的有效可觸摸的UI元素標準是48dp,轉(zhuǎn)化為一個物理尺寸約為9毫米。7~10毫米,這是一個用戶手指能準確并且舒適觸摸的區(qū)域。本文將介紹Android擴大View點擊范圍的方法
    2021-05-05
  • Android?使用壓縮紋理的方案

    Android?使用壓縮紋理的方案

    這篇文章主要介紹了Android?使用壓縮紋理,本文介紹了什么是壓縮紋理,以及加載壓縮紋理的核心步驟,并在 Android OpenGLES 平臺上實現(xiàn)了壓縮紋理的顯示,需要的朋友可以參考下
    2022-09-09
  • Android百度地圖應(yīng)用之MapFragment的使用

    Android百度地圖應(yīng)用之MapFragment的使用

    這篇文章主要為大家詳細介紹了Android百度地圖應(yīng)用之MapFragment的使用的相關(guān)資料,需要的朋友可以參考下
    2016-06-06

最新評論

察哈| 新乡市| 定结县| 澄城县| 罗平县| 榆社县| 河曲县| 勐海县| 布尔津县| 泾川县| 房产| 福建省| 灵武市| 阳原县| 洪湖市| 玉林市| 中江县| 泸西县| 边坝县| 清流县| 葵青区| 塔城市| 沙雅县| 金湖县| 通化市| 宁强县| 黑水县| 兴和县| 疏附县| 大庆市| 额尔古纳市| 罗定市| 南城县| 南部县| 棋牌| 安塞县| 丹东市| 苍梧县| 普兰店市| 扎囊县| 阿瓦提县|