Android+Flutter實(shí)現(xiàn)文字跑馬燈特效
跑馬燈被運(yùn)用在很多領(lǐng)域, 例如商場(chǎng)的電子條幅、大樓的宣傳廣告位、地鐵的廣告位.不過毫無疑問的是它們都是為了解決文字過長(zhǎng)的問題而應(yīng)景給出的一種解決方案.
今天我們來說一下flutter 怎么通過繪制來實(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è)東西來驅(qū)動(dòng)它去前行.

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

它可能很短,也可能和給定的的區(qū)域相等,也可能遠(yuǎn)超我們給定的區(qū)域. 在這種情況下,我們應(yīng)該首先獲取文字的寬度.然后確定每秒它會(huì)移動(dòng)多少.并且還需要一個(gè)驅(qū)動(dòng)器來驅(qū)動(dòng)它去做這些變化.
測(cè)量文字
如果大家寫過Flutter, 一定用過Text Widget. 既然Text Widget 可以根據(jù)文字大小來展示,說明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;
// 如果超過了文字大小和間距的總長(zhǎng)度,說明當(dāng)前的文字已經(jīng)超出了屏幕.
// 我們應(yīng)該用緊接著下一條數(shù)據(jù)的偏移量賦值.
if (head < -width - margin) {
head += width + margin;
}
notifyListeners();
}
}動(dòng)畫為媒
文字測(cè)量完后, 我們還需要一個(gè)可以驅(qū)動(dòng)文字移動(dòng)的驅(qū)動(dòng)器. 這里你可以通過ticker自己實(shí)現(xiàn)一個(gè)驅(qū)動(dòng). 我們?yōu)榱撕?jiǎn)單化考慮, 沒錯(cuò)~ 我們又要請(qǐng)出我們的好兄弟AnimationController重出江湖了
實(shí)際上這里運(yùn)用不了太多AnimationController的參數(shù),我們唯一需要在乎的就是Duration, 也就是時(shí)間越短.我們將跑的越快.時(shí)間越長(zhǎng),跑的越慢.可以說是反比關(guān)系.
{
AnimationController _scrollController =
AnimationController(vsync: this, duration: const Duration(seconds:1));
}最終繪制
萬事俱備,只欠東風(fēng). 像一個(gè)方程, 我們所有的未知數(shù)都有了解. 只剩下最后求y了. 這里我們通過CustomPainter來繪制文字. 我們之前通過創(chuàng)建自己的類保存了文字信息,同時(shí)讓它繼承了ChangeNotifier就是為了今朝.
_RevolvingLanternPainter(
this.painter,
this.textInfo,
) : super(repaint: textInfo);
我們將CustomPainter的repaint參數(shù)賦值成我們自己定義的類. 每次我們update() 都會(huì)通知界面來刷新,從而不會(huì)影響別的界面, 只影響當(dāng)前的繪制畫布. 然后, 我們就可以去真正的繪制啦~ 這里我們唯一需要做的,就是給一個(gè)值x記錄下所有文字的偏移量. 如果偏移量大于當(dāng)前的界面. 說明它不在界面上, 也就不用繪制啦!
@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;
}
}
通過這種方法, 我們實(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)文章
Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解
這篇文章主要為大家介紹了Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
詳解RecyclerView設(shè)置背景圖片長(zhǎng)寬一樣(以GridLayoutManager為例)
這篇文章主要介紹了詳解RecyclerView設(shè)置背景圖片長(zhǎng)寬一樣(以GridLayoutManager為例),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Android讀取手機(jī)通訊錄聯(lián)系人到自己項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了Android讀取手機(jī)通訊錄聯(lián)系人到自己項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android編程中Tween動(dòng)畫和Frame動(dòng)畫實(shí)例分析
這篇文章主要介紹了Android編程中Tween動(dòng)畫和Frame動(dòng)畫,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android中Tween動(dòng)畫和Frame動(dòng)畫的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12
Android持久化技術(shù)之文件的讀取與寫入實(shí)例詳解
這篇文章主要介紹了Android持久化技術(shù)之文件的讀取與寫入操作,結(jié)合實(shí)例形式較為詳細(xì)的分析講述了Android持久化操作的相關(guān)技巧與具體實(shí)現(xiàn)方法,需要的朋友可以參考下2016-01-01
Android編程獲取手機(jī)后臺(tái)運(yùn)行服務(wù)的方法
這篇文章主要介紹了Android編程獲取手機(jī)后臺(tái)運(yùn)行服務(wù)的方法,涉及Android針對(duì)系統(tǒng)服務(wù)的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
Android擴(kuò)大View點(diǎn)擊范圍的方法
Android4.0設(shè)計(jì)規(guī)定的有效可觸摸的UI元素標(biāo)準(zhǔn)是48dp,轉(zhuǎn)化為一個(gè)物理尺寸約為9毫米。7~10毫米,這是一個(gè)用戶手指能準(zhǔn)確并且舒適觸摸的區(qū)域。本文將介紹Android擴(kuò)大View點(diǎn)擊范圍的方法2021-05-05
Android百度地圖應(yīng)用之MapFragment的使用
這篇文章主要為大家詳細(xì)介紹了Android百度地圖應(yīng)用之MapFragment的使用的相關(guān)資料,需要的朋友可以參考下2016-06-06

