欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

我們的 App 大部分時候的文字都是一種顏色,實際上,文字的顏色也可以多姿多彩。我們今天就來介紹一個能夠輕松實現(xiàn)文字漸變色的組件 —— ShaderMask。ShaderMask 能夠構(gòu)建一個著色器(shader),然后覆蓋(mask)到它的子組件上,從而改變子組件的顏色。

ShaderMask 實現(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 的子類(如 LinearGradientRadialGradial)來創(chuàng)建著色器。blendMode 參數(shù)則用于設(shè)置著色的方式。 因此,我們可以利用LinearGradient來實現(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,
    ),
  ),
),

實現(xiàn)效果如下圖。

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

讓漸變色動起來

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

這里其實就是使用了動畫控制 transform 實現(xiàn)橫向平移。由于 transform 是一個 GradientTransform 類,實現(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 動畫對象的值控制漸變色平移的距離就可以實現(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 使用圖片填充文字,實現(xiàn)一些其他的文字特效,比如用火焰圖片作為背景,讓文字看起來像燃燒了一樣。

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

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

相關(guān)文章

  • Android Jetpack組件庫LiveData源碼深入探究

    Android Jetpack組件庫LiveData源碼深入探究

    LiveData是Jetpack組件的一部分,更多的時候是搭配ViewModel來使用,相對于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動生命周期狀態(tài)的時候才會更新數(shù)據(jù)
    2022-09-09
  • Flutter UI實現(xiàn)側(cè)拉抽屜菜單

    Flutter UI實現(xiàn)側(cè)拉抽屜菜單

    這篇文章主要為大家詳細介紹了Flutter UI實現(xiàn)側(cè)拉抽屜菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android ExpandableListView單選以及多選實現(xiàn)代碼

    Android ExpandableListView單選以及多選實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了Android ExpandableListView單選以及多選的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android仿外賣購物車功能

    Android仿外賣購物車功能

    這篇文章主要為大家詳細介紹了Android仿外賣購物車功能的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android?Retrofit使用詳細教程

    Android?Retrofit使用詳細教程

    Retrofit是Android用來接口請求的網(wǎng)絡(luò)框架,內(nèi)部是基于OkHttp實現(xiàn)的,retrofit負責接口請求的封裝,retrofit可以直接將接口數(shù)據(jù)解析為Bean類、List集合等,直接簡化了中間繁瑣的數(shù)據(jù)解析過程,這篇文章主要介紹了Android?Retrofit使用詳情,需要的朋友可以參考下
    2024-03-03
  • Android移動應(yīng)用開發(fā)指南之六種布局詳解

    Android移動應(yīng)用開發(fā)指南之六種布局詳解

    Android應(yīng)用界面要美觀好看,就需要運用到一定的布局技術(shù),Android布局是不可忽視的,是android應(yīng)用界面開發(fā)的重要一環(huán),這篇文章主要給大家介紹了關(guān)于Android移動應(yīng)用開發(fā)指南之六種布局的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Android編程使用內(nèi)容提供者方式(ContentProvider)進行存儲的方法

    Android編程使用內(nèi)容提供者方式(ContentProvider)進行存儲的方法

    這篇文章主要介紹了Android編程使用內(nèi)容提供者方式進行存儲的方法,涉及Android內(nèi)容提供者的創(chuàng)建,配置及針對數(shù)據(jù)的增刪改查等操作技巧,需要的朋友可以參考下
    2016-01-01
  • Android使用自定義字體的方法

    Android使用自定義字體的方法

    這篇文章主要介紹了Android使用自定義字體的方法,涉及Android字體設(shè)置的步驟與相關(guān)注意事項,需要的朋友可以參考下
    2016-01-01
  • Android自定義videoview仿抖音界面

    Android自定義videoview仿抖音界面

    這篇文章主要為大家詳細介紹了Android自定義videoview仿抖音界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android 添加TextView刪除線(代碼簡單)

    Android 添加TextView刪除線(代碼簡單)

    最近接了個項目,其中有項目需求是這樣的,有這么個需求,就是一個產(chǎn)品下有兩個價格,一個是市場價,一個是銷售價,這時要把市場價添加個刪除線;怎么實現(xiàn)呢?下面小編給大家分享一段簡單的代碼實現(xiàn)Android 添加TextView刪除線
    2016-02-02

最新評論