在前段時間寫代碼的時候,碰到個需求:給這個文字加上漸變色!html
當時我內心只有一張圖:api
先看一下效果圖:app
嘿,你別說還挺好看。編輯器
話很少說,瞭解一下是如何實現的吧。動畫
請出今天的主角:ShaderMask
。ui
按照慣例,咱們仍是先來看一下官方的介紹:spa
A widget that applies a mask generated by a Shader to its child.code
一個小部件,將由着色器生成的遮罩應用於其子級。cdn
知道了ShaderMask
的做用以後咱們就接着來看一下官方的示例:htm
ShaderMask(
shaderCallback: (Rect bounds) {
return RadialGradient(
center: Alignment.topLeft,
radius: 1.0,
colors: <Color>[Colors.yellow, Colors.deepOrange.shade900],
tileMode: TileMode.mirror,
).createShader(bounds);
},
child: const Text('I’m burning the memories'),
)
複製代碼
然而,當咱們把這段代碼複製到編輯器,運行後:
什麼也沒有發生,由於咱們的字是黑色的!
改一下,改爲白色:
這就是官方demo的例子,也是 ShaderMask
最基礎的用法,下面就來講一下進階的用法。
先看一下效果:
其實這個和 ShaderMask
自己沒有什麼關係了,是「着色器」和「動畫」的合做後,最後遮罩在一個 Widget 上所達到了如今的效果。
關鍵代碼以下:
shaderCallback: (Rect bounds) {
return LinearGradient(colors: _colors, stops: [
0 + _gradientValue * 0.2,
_gradientValue * 0.8,
1 - _gradientValue * 0.3
]).createShader(bounds);
}
複製代碼
最重要的是 stops
參數,他規定了漸變的顏色所在區域,值從0到1.
這樣再加上動畫,就完成了一個會動的漸變色這樣的效果。
前面我只是用了一個文原本演示 ShaderMask
的基礎用法,然而 ShaderMask
的 child 能夠是任意 Widget。
好比:
ShaderMask
能夠很方便的爲咱們添加顏色,可是咱們須要注意其中一點:
shader
是處於下層的,child
處於上層,也就是說,是咱們的 child
蓋住了 shader
。
咱們能夠經過 blendMode
來控制他倆重疊部分的效果,以下:
圖來自張風捷特烈