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

Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效

 更新時(shí)間:2022年12月04日 08:46:05   作者:島上碼農(nóng)  
我們的?App?大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來(lái)介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下

前言

我們的 App 大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來(lái)介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件 —— ShaderMaskShaderMask 能夠構(gòu)建一個(gè)著色器(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)方法,通過(guò) 回調(diào)方法可以構(gòu)建一個(gè)著色器來(lái)為子組件著色,典型的做法是使用 Gradient 的子類(lèi)(如 LinearGradientRadialGradial)來(lái)創(chuàng)建著色器。blendMode 參數(shù)則用于設(shè)置著色的方式。 因此,我們可以利用LinearGradient來(lái)實(shí)現(xiàn)漸變色文字,示例代碼如下,其中 blendMode 選擇為 BlendMode.srcIn 是忽略子組件原有的顏色,使用著色器來(lái)對(duì)子組件著色。

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ū)ξ淖种?,還可以對(duì)圖片著色,比如我們使用一個(gè) Row 組件在文字前面增加一個(gè)Image 組件,可以實(shí)現(xiàn)下面的效果。

讓漸變色動(dòng)起來(lái)

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

這里其實(shí)就是使用了動(dòng)畫(huà)控制 transform 實(shí)現(xiàn)橫向平移。由于 transform 是一個(gè) GradientTransform 類(lèi),實(shí)現(xiàn)這樣的效果需要定義一個(gè)GradientTransform子類(lèi),如下所示。

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

然后通過(guò) Animation 動(dòng)畫(huà)對(duì)象的值控制漸變色平移的距離就可以實(shí)現(xiàn)漸變色橫向掃過(guò)的效果了,代碼如下所示。

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)一些其他的文字特效,比如用火焰圖片作為背景,讓文字看起來(lái)像燃燒了一樣。

實(shí)現(xiàn)的代碼如下,其中動(dòng)效是通過(guò) ImageShader 的構(gòu)造函數(shù)的第4個(gè)參數(shù)的矩陣matrix4運(yùn)算實(shí)現(xiàn)的,相當(dāng)于是讓填充圖片移動(dòng)來(lái)實(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)用,通過(guò) ShaderMask 組件我們可以對(duì)子組件進(jìn)行著色,從而改變子組件原來(lái)的顏色,實(shí)現(xiàn)如漸變色填充、圖片填充等效果。本篇完整源碼已提交至:實(shí)用組件相關(guān)源碼。

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

相關(guān)文章

  • Android 8.1 Launcher3實(shí)現(xiàn)動(dòng)態(tài)指針時(shí)鐘功能

    Android 8.1 Launcher3實(shí)現(xiàn)動(dòng)態(tài)指針時(shí)鐘功能

    這篇文章主要介紹了Android 8.1 Launcher3實(shí)現(xiàn)動(dòng)態(tài)指針時(shí)鐘功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Android原生視頻播放VideoView的使用

    Android原生視頻播放VideoView的使用

    這篇文章主要為大家詳細(xì)介紹了Android原生視頻播放VideoView的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • android camera yuv幀水平翻轉(zhuǎn)實(shí)例

    android camera yuv幀水平翻轉(zhuǎn)實(shí)例

    今天小編就為大家分享一篇android camera yuv幀水平翻轉(zhuǎn)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Android頁(yè)面中引導(dǎo)蒙層的使用方法詳解

    Android頁(yè)面中引導(dǎo)蒙層的使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android頁(yè)面中的引導(dǎo)蒙層使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Android 7.0 運(yùn)行時(shí)權(quán)限彈窗問(wèn)題的解決

    Android 7.0 運(yùn)行時(shí)權(quán)限彈窗問(wèn)題的解決

    這篇文章主要介紹了Android 7.0 運(yùn)行時(shí)權(quán)限彈窗問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Android中自定義View的實(shí)現(xiàn)方式總結(jié)大全

    Android中自定義View的實(shí)現(xiàn)方式總結(jié)大全

    這篇文章主要總結(jié)了Android中自定義View的實(shí)現(xiàn)方式的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們學(xué)習(xí)或者使用自定義View具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • 詳解Android Checkbox的使用方法

    詳解Android Checkbox的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android Checkbox的使用方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android自定義ScrollView使用自定義監(jiān)聽(tīng)

    Android自定義ScrollView使用自定義監(jiān)聽(tīng)

    這篇文章主要介紹了Android自定義ScrollView使用自定義監(jiān)聽(tīng) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • android仿微信表情雨下落效果的實(shí)現(xiàn)方法

    android仿微信表情雨下落效果的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于android仿微信表情雨下落效果的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)

    Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)

    這篇文章主要為大家介紹了Android自定義ViewGroup嵌套與交互實(shí)現(xiàn)幕布全屏滾動(dòng)效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

施秉县| 新闻| 县级市| 怀化市| 密云县| 博兴县| 张家口市| 澄迈县| 长子县| 天门市| 邮箱| 台北市| 林芝县| 社会| 舞钢市| 宁波市| 犍为县| 堆龙德庆县| 深州市| 六盘水市| 中牟县| 孟连| 封开县| 鄂伦春自治旗| 肃南| 敖汉旗| 沧州市| 西峡县| 长治县| 叶城县| 铜山县| 通山县| 河南省| 南漳县| 东莞市| 九江市| 那曲县| 延庆县| 惠水县| 云霄县| 尚志市|