Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效
前言
我們的 App 大部分時候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來介紹一個能夠輕松實(shí)現(xiàn)文字漸變色的組件 —— ShaderMask。ShaderMask 能夠構(gòu)建一個著色器(shader),然后覆蓋(mask)到它的子組件上,從而改變子組件的顏色。
ShaderMask 實(shí)現(xiàn)漸變色文字
ShaderMask 的構(gòu)造函數(shù)定義如下。
const ShaderMask({
Key? key,
required this.shaderCallback,
this.blendMode = BlendMode.modulate,
Widget? child,
})其中關(guān)鍵的參數(shù)是 shaderCallback回調(diào)方法,通過 回調(diào)方法可以構(gòu)建一個著色器來為子組件著色,典型的做法是使用 Gradient 的子類(如 LinearGradient 和 RadialGradial)來創(chuàng)建著色器。blendMode 參數(shù)則用于設(shè)置著色的方式。 因此,我們可以利用LinearGradient來實(shí)現(xiàn)漸變色文字,示例代碼如下,其中 blendMode 選擇為 BlendMode.srcIn 是忽略子組件原有的顏色,使用著色器來對子組件著色。
ShaderMask(
shaderCallback: (rect) {
return LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Colors.blue,
Colors.green[300]!,
Colors.orange[400]!,
Colors.red,
],
).createShader(rect);
},
blendMode: BlendMode.srcIn,
child: const Text(
'島上碼農(nóng)',
style: TextStyle(
fontSize: 36.0,
fontWeight: FontWeight.bold,
),
),
),實(shí)現(xiàn)效果如下圖。

實(shí)際上,不僅僅能夠?qū)ξ淖种?,還可以對圖片著色,比如我們使用一個 Row 組件在文字前面增加一個Image 組件,可以實(shí)現(xiàn)下面的效果。

讓漸變色動起來
靜態(tài)的漸變色著色還不夠,Gradient 還有個 transform 來實(shí)現(xiàn)三維空間變換的漸變效果,我們可以利用這個參數(shù)和動畫組件實(shí)現(xiàn)動畫效果,比如下面這樣。

這里其實(shí)就是使用了動畫控制 transform 實(shí)現(xiàn)橫向平移。由于 transform 是一個 GradientTransform 類,實(shí)現(xiàn)這樣的效果需要定義一個GradientTransform子類,如下所示。
@immutable
class SweepTransform extends GradientTransform {
const SweepTransform(this.dx, this.dy);
final double dx;
final double dy;
@override
Matrix4 transform(Rect bounds, {TextDirection? textDirection}) {
return Matrix4.identity()..translate(dx, dy);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) {
return true;
}
if (other.runtimeType != runtimeType) {
return false;
}
return other is SweepTransform && other.dx == dx && other.dy == dy;
}
@override
int get hashCode => dx.hashCode & dy.hashCode;
}然后通過 Animation 動畫對象的值控制漸變色平移的距離就可以實(shí)現(xiàn)漸變色橫向掃過的效果了,代碼如下所示。
ShaderMask(
shaderCallback: (rect) {
return LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Colors.blue,
Colors.green[300]!,
Colors.orange[400]!,
Colors.red,
],
transform: SweepTransform(
(_animation.value - 0.5) * rect.width, 0.0),
).createShader(rect);
},
blendMode: BlendMode.srcIn,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'images/logo.png',
scale: 2,
),
const Text(
'島上碼農(nóng)',
style: TextStyle(
fontSize: 36.0,
fontWeight: FontWeight.bold,
),
),
],
),
),圖片填充
除了使用漸變色之外,我們還可以利用 ImageShader 使用圖片填充文字,實(shí)現(xiàn)一些其他的文字特效,比如用火焰圖片作為背景,讓文字看起來像燃燒了一樣。

實(shí)現(xiàn)的代碼如下,其中動效是通過 ImageShader 的構(gòu)造函數(shù)的第4個參數(shù)的矩陣matrix4運(yùn)算實(shí)現(xiàn)的,相當(dāng)于是讓填充圖片移動來實(shí)現(xiàn)火焰往上升的效果。
ShaderMask(
shaderCallback: (rect) {
return ImageShader(
fillImage,
TileMode.decal,
TileMode.decal,
(Matrix4.identity()
..translate(-20.0 * _animation.value,
-150.0 * _animation.value))
.storage);
},
blendMode: BlendMode.srcIn,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'images/logo.png',
scale: 2,
),
const Text(
'島上碼農(nóng)',
style: TextStyle(
fontSize: 36.0,
fontWeight: FontWeight.bold,
),
),
],
),
)總結(jié)
本篇介紹了 ShaderMask 組件的應(yīng)用,通過 ShaderMask 組件我們可以對子組件進(jìn)行著色,從而改變子組件原來的顏色,實(shí)現(xiàn)如漸變色填充、圖片填充等效果。本篇完整源碼已提交至:實(shí)用組件相關(guān)源碼。
到此這篇關(guān)于Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效的文章就介紹到這了,更多相關(guān)Android ShaderMask文字特效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 8.1 Launcher3實(shí)現(xiàn)動態(tài)指針時鐘功能
這篇文章主要介紹了Android 8.1 Launcher3實(shí)現(xiàn)動態(tài)指針時鐘功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
android camera yuv幀水平翻轉(zhuǎn)實(shí)例
今天小編就為大家分享一篇android camera yuv幀水平翻轉(zhuǎn)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Android 7.0 運(yùn)行時權(quán)限彈窗問題的解決
這篇文章主要介紹了Android 7.0 運(yùn)行時權(quán)限彈窗問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Android中自定義View的實(shí)現(xiàn)方式總結(jié)大全
這篇文章主要總結(jié)了Android中自定義View的實(shí)現(xiàn)方式的相關(guān)資料,文中介紹的非常詳細(xì),對各位Android開發(fā)者們學(xué)習(xí)或者使用自定義View具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04
Android自定義ScrollView使用自定義監(jiān)聽
這篇文章主要介紹了Android自定義ScrollView使用自定義監(jiān)聽 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
android仿微信表情雨下落效果的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于android仿微信表情雨下落效果的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動
這篇文章主要為大家介紹了Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

