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

利用Flutter實現(xiàn)背景圖片毛玻璃效果實例

 更新時間:2022年06月26日 08:19:11   作者:島上碼農(nóng)  
Flutter沒有單獨的模糊處理容器,需要部件層層疊加實現(xiàn)模糊效果,下面這篇文章主要給大家介紹了關(guān)于利用Flutter實現(xiàn)背景圖片毛玻璃效果的相關(guān)資料,需要的朋友可以參考下

前言

繼續(xù)我們繪圖相關(guān)篇章,這次我們來看看如何使用 CustomPaint 實現(xiàn)毛玻璃背景圖效果。毛玻璃背景圖其實就是將圖片進行一定程度的模糊,背景圖經(jīng)過模糊后更加虛幻,使得前景和后景就會有層次感。相比直接加蒙層的效果來說,毛玻璃看起來更加好看一些。下面是背景圖處理前后的對比,我們的前景圖片的透明度并沒有改變,但是背景圖模糊虛化后,感覺前景更加顯眼了一樣。

本篇涉及如下內(nèi)容:

  • 使用 canvas 繪制圖片。
  • 繪制圖片時如何更改圖片的填充范圍。
  • 使用 ImageFilter 模糊圖片,實現(xiàn)毛玻璃效果。

使用 canvas 繪制圖片

Flutter 為 canvas 提供了drawImage 方法用于繪制圖片,方法定義如下:

void drawImage(Image image, Offset offset, Paint paint)

其中各個參數(shù)說明如下:

  • imagedart:ui 中的 Image 對象,注意不是Widget 中的 Image,因此繪制的時候需要將圖片資源轉(zhuǎn)換為 ui.Image 對象。下面是轉(zhuǎn)換的示例代碼,fillImage 即最終得到的 ui.Image 對象。注意轉(zhuǎn)換需要一定的時間,因此需要使用異步 async / await 操作。
Future<void> init() async {
  final ByteData data = await rootBundle.load('images/island-coder.png');
  fillImage = await loadImage(Uint8List.view(data.buffer));
}

Future<ui.Image> loadImage(Uint8List img) async {
  final Completer<ui.Image> completer = Completer();
  ui.decodeImageFromList(img, (ui.Image img) {
    setState(() {
      isImageLoaded = true;
    });
    return completer.complete(img);
  });
  return completer.future;
}
  • offset:繪制圖片的起始位置。
  • paint:繪圖畫筆對象,在 paint 上可以應(yīng)用各種處理效果,比如本篇要用到的圖片模糊效果。

注意,drawImage 方法無法更改圖片繪制的區(qū)域大小,默認就是按圖片的實際尺寸繪制的,所以如果要想保證全屏的背景圖,我們就需要使用另一個繪制圖片的方法。

更改繪制圖片的繪制范圍

Flutter 的 canvas 為繪制圖片提供了一個尺寸轉(zhuǎn)換方法,即可以通過指定原繪制區(qū)域的矩形和目標(biāo)區(qū)域的矩形,將圖片某個區(qū)域映射到新的矩形框中繪制。也就是我們甚至可以實現(xiàn)繪制圖片的局部區(qū)域。該方法名為 drawImageRect,定義如下:

void drawImageRect(Image image, Rect src, Rect dst, Paint paint)

方法的參數(shù)比較容易懂,我們來看看 Flutter 的文檔說明。

Draws the subset of the given image described by the src argument into the canvas in the axis-aligned rectangle given by the dst argument. 翻譯:通過 src 參數(shù)將給定圖片的局部(subset)繪制到坐標(biāo)軸對齊的目標(biāo)矩形區(qū)域內(nèi)。

下面是我們將源矩形框設(shè)置為實際圖片的尺寸和一半寬高的對比圖,可以看到取一半寬高的只繪制了左上角的1/4區(qū)域。實際我們可以定位起始位置來截取部分區(qū)域繪制。

毛玻璃效果實現(xiàn)

毛玻璃效果實現(xiàn)和我們上兩篇使用 paintshader屬性有點類似,Paint 類提供了一個imageFilter屬性專門用于圖片處理,其中dart:ui 中就提供了ui.ImageFilter.blur方法構(gòu)建模糊效果處理的 ImageFilter對象。方法定義如下:

factory ImageFilter.blur({ 
  double sigmaX = 0.0, 
  double sigmaY = 0.0, 
  TileMode tileMode = TileMode.clamp 
})

這個方法實際調(diào)用的是一個高斯模糊處理器,高斯模糊其實就是應(yīng)用一個方法將像素點周邊指定范圍的值進行處理,進而實現(xiàn)模糊效果,有興趣的可以自行百度一下。下面的 sigmaXsigmaY 分布代表橫軸方向和縱軸方向的模糊程度,數(shù)值越大,模糊程度越厲害。因此我們可以通過這兩個參數(shù)控制模糊程度。

return _GaussianBlurImageFilter(
  sigmaX: sigmaX, 
  sigmaY: sigmaY, 
  tileMode: tileMode
);

**注意,這里 sigmaX 和 sigmaY 不能同時為0,否則會報錯!**這里應(yīng)該是如果同時為0會導(dǎo)致除0操作。 下面來看整體的繪制實現(xiàn)代碼,如下所示:

class BlurImagePainter extends CustomPainter {
  final ui.Image bgImage;
  final double blur;

  BlurImagePainter({
    required this.bgImage,
    required this.blur,
  });
  @override
  void paint(Canvas canvas, Size size) {
    var paint = Paint();
    // 模糊的取值不能為0,為0會拋異常
    if (blur > 0) {
      paint.imageFilter = ui.ImageFilter.blur(
        sigmaX: blur,
        sigmaY: blur,
        tileMode: TileMode.mirror,
      );
    }

    canvas.drawImageRect(
      bgImage,
      Rect.fromLTRB(0, 0, bgImage.width.toDouble(), bgImage.height.toDouble()),
      Offset.zero & size,
      paint,
    );
  }

代碼其實很短,就是在模糊值不為0的時候,應(yīng)用 imageFilter 進行模糊處理,然后使用 drawImageRect 方法確保圖片填充滿整個背景。完整代碼已經(jīng)提交至:繪圖相關(guān)代碼,文件名為:blur_image_demo.dart。變換模糊值的效果如下動圖所示。

總結(jié)

本篇介紹了使用 CustomPaint 實現(xiàn)背景圖模糊,毛玻璃的效果。關(guān)鍵點在于 使用 Paint 對象的 imageFilter屬性,使用高斯模糊應(yīng)用到圖片上。以后碰到需要模糊背景圖的地方就可以直接上手用啦!

到此這篇關(guān)于利用Flutter實現(xiàn)背景圖片毛玻璃效果的文章就介紹到這了,更多相關(guān)Flutter背景圖片毛玻璃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android 使用fast-verification實現(xiàn)驗證碼填寫功能的實例代碼

    Android 使用fast-verification實現(xiàn)驗證碼填寫功能的實例代碼

    這篇文章主要介紹了Android 使用fast-verification實現(xiàn)驗證碼填寫功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android系統(tǒng)底層Reboot流程源碼解讀

    Android系統(tǒng)底層Reboot流程源碼解讀

    本文主要關(guān)注?Android?系統(tǒng)底層的?Reboot?流程,主要涉及?Native、Kenrel、Recovery、Bootloader,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Android自定義PopupWindow仿點擊彈出分享功能

    Android自定義PopupWindow仿點擊彈出分享功能

    這篇文章主要為大家詳細介紹了Android自定義PopupWindow仿點擊彈出分享功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android實現(xiàn)可點擊的幸運大轉(zhuǎn)盤

    Android實現(xiàn)可點擊的幸運大轉(zhuǎn)盤

    這篇文章主要為大家詳細介紹了Android實現(xiàn)可點擊的幸運大轉(zhuǎn)盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 全面解析Android中對EditText輸入實現(xiàn)監(jiān)聽的方法

    全面解析Android中對EditText輸入實現(xiàn)監(jiān)聽的方法

    這篇文章主要介紹了Android中對EditText輸入實現(xiàn)監(jiān)聽的方法,包括一個仿iOS的帶清除功能的ClearEditText輸入框控件的詳細使用介紹,需要的朋友可以參考下
    2016-04-04
  • Android實現(xiàn)百度地圖兩點畫弧線

    Android實現(xiàn)百度地圖兩點畫弧線

    這篇文章主要為大家詳細介紹了Android實現(xiàn)百度地圖兩點畫弧線,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Retrofit2日志攔截器的使用

    Retrofit2日志攔截器的使用

    這篇文章主要介紹了Retrofit2日志攔截器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Flutter中漸變色的使用案例分享

    Flutter中漸變色的使用案例分享

    在日常的開發(fā)中,UI為了讓界面更加吸引人往往會在界面上用到大量的漸變色,本文將通過幾個案例更好的去了解Flutter中漸變色的使用,需要的可以參考一下
    2023-06-06
  • Android中實現(xiàn)根據(jù)資源名獲取資源ID

    Android中實現(xiàn)根據(jù)資源名獲取資源ID

    這篇文章主要介紹了Android中實現(xiàn)根據(jù)資源名獲取資源ID,本文講解了使用文件名獲取資源ID的方法,需要的朋友可以參考下
    2015-01-01
  • Android懸浮窗的實現(xiàn)步驟

    Android懸浮窗的實現(xiàn)步驟

    最近想做一個懸浮窗秒表的功能,所以看下懸浮窗具體的實現(xiàn)步驟,接下來通過本文給大家介紹Android懸浮窗的實現(xiàn),需要的朋友可以參考下
    2024-01-01

最新評論