<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
繼續我們繪圖相關篇章,這次我們來看看如何使用 CustomPaint 實現毛玻璃背景圖效果。毛玻璃背景圖其實就是將圖片進行一定程度的模糊,背景圖經過模糊後更加虛幻,使得前景和後景就會有層次感。相比直接加蒙層的效果來說,毛玻璃看起來更加好看一些。下面是背景圖處理前後的對比,我們的前景圖片的透明度並沒有改變,但是背景圖模糊虛化後,感覺前景更加顯眼了一樣。
本篇涉及如下內容:
Flutter 為 canvas
提供了drawImage
方法用於繪製圖片,方法定義如下:
void drawImage(Image image, Offset offset, Paint paint)
其中各個引數說明如下:
image
:dart:ui
中的 Image
物件,注意不是Widget
中的 Image
,因此繪製的時候需要將圖片資源轉換為 ui.Image
物件。下面是轉換的範例程式碼,fillImage 即最終得到的 ui.Image
物件。注意轉換需要一定的時間,因此需要使用非同步 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
上可以應用各種處理效果,比如本篇要用到的圖片模糊效果。注意,drawImage
方法無法更改圖片繪製的區域大小,預設就是按圖片的實際尺寸繪製的,所以如果要想保證全螢幕的背景圖,我們就需要使用另一個繪製圖片的方法。
Flutter 的 canvas
為繪製圖片提供了一個尺寸轉換方法,即可以通過指定原繪製區域的矩形和目標區域的矩形,將圖片某個區域對映到新的矩形框中繪製。也就是我們甚至可以實現繪製圖片的區域性區域。該方法名為 drawImageRect
,定義如下:
void drawImageRect(Image image, Rect src, Rect dst, Paint paint)
方法的引數比較容易懂,我們來看看 Flutter 的檔案說明。
Draws the subset of the given image described by the
src
argument into the canvas in the axis-aligned rectangle given by thedst
argument. 翻譯:通過 src 引數將給定圖片的區域性(subset)繪製到座標軸對齊的目標矩形區域內。
下面是我們將源矩形框設定為實際圖片的尺寸和一半寬高的對比圖,可以看到取一半寬高的只繪製了左上角的1/4區域。實際我們可以定位起始位置來擷取部分割區域繪製。
毛玻璃效果實現和我們上兩篇使用 paint
的 shader
屬性有點類似,Paint 類提供了一個imageFilter
屬性專門用於圖片處理,其中dart:ui
中就提供了ui.ImageFilter.blur
方法構建模糊效果處理的 ImageFilter
物件。方法定義如下:
factory ImageFilter.blur({ double sigmaX = 0.0, double sigmaY = 0.0, TileMode tileMode = TileMode.clamp })
這個方法實際呼叫的是一個高斯模糊處理器,高斯模糊其實就是應用一個方法將畫素點周邊指定範圍的值進行處理,進而實現模糊效果,有興趣的可以自行百度一下。下面的 sigmaX
和 sigmaY
分佈代表橫軸方向和縱軸方向的模糊程度,數值越大,模糊程度越厲害。因此我們可以通過這兩個引數控制模糊程度。
return _GaussianBlurImageFilter( sigmaX: sigmaX, sigmaY: sigmaY, tileMode: tileMode );
**注意,這裡 sigmaX 和 sigmaY 不能同時為0,否則會報錯!**這裡應該是如果同時為0會導致除0操作。 下面來看整體的繪製實現程式碼,如下所示:
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的時候,應用 imageFilter
進行模糊處理,然後使用 drawImageRect
方法確保圖片填充滿整個背景。完整程式碼已經提交至:繪圖相關程式碼,檔名為:blur_image_demo.dart
。變換模糊值的效果如下動圖所示。
本篇介紹了使用 CustomPaint 實現背景圖模糊,毛玻璃的效果。關鍵點在於 使用 Paint
物件的 imageFilter
屬性,使用高斯模糊應用到圖片上。以後碰到需要模糊背景圖的地方就可以直接上手用啦!
到此這篇關於利用Flutter實現背景圖片毛玻璃效果的文章就介紹到這了,更多相關Flutter背景圖片毛玻璃內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45