Flutter高斯模糊的實現(xiàn)及性能優(yōu)化

寫在前面

Flutter中的高斯模糊(毛玻璃)大家應(yīng)該都不陌生,我們可以用它實現(xiàn)畫中畫,閱后即焚渔扎,付費看高清等功能沮趣,是常用的UI組件肚吏。目前我正在做的項目中使用的點是 閱后即焚 IM中發(fā)送圖片的功能

先放一張圖

實現(xiàn)頁面
通常處理
Stack(
   children: [
      CachedNetworkImage(imageUrl: path, fit: BoxFit.cover, width: width, height: height),
      Container(
        alignment: Alignment.center,
        clipBehavior: Clip.hardEdge,
        decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.fit)),
        child: BackdropFilter(
          filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
          child: Container(color: Colors.white.withAlpha(0)),
        ),
      ),
    ],
)
  

很簡單 就實現(xiàn)了我們想要的效果成福,到這里就完了嗎橡类,也不是 我們滑動頁面debug模式先會明顯看到頁面的卡頓桥滨,這是我們所不允許的笼蛛,使用DevTools看滑動過程中的看繪制情況
2個圖片的繪制情況


系統(tǒng)filter繪制情況
優(yōu)化

上圖我們發(fā)現(xiàn)滑動過程中繪制情況不容樂觀 這也是出現(xiàn)卡頓的原因
那有沒有別的方法呢洒放,當(dāng)然有,看具體代碼

Widget _blur(double width, double height) {
    loadNetImage(msg.image?.remotePath ?? '');
    return Obx(
      () => image.value != null
          ? CustomPaint(
              size: Size(width, height), painter: GlassPainter(image.value!, Size(image.value!.width.toDouble(), image.value!.height.toDouble())))
          : Container(),
    );
    return Container(
      alignment: Alignment.center,
      clipBehavior: Clip.hardEdge,
      decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.fit)),
      child: BackdropFilter(
        filter: ui.ImageFilter.blur(sigmaX: 10, sigmaY: 10),
        child: Container(color: Colors.white.withAlpha(0)),
      ),
    );
  }

// 這里是加載的網(wǎng)絡(luò)圖片 同樣可以換為本地圖片或是加載file文件
  Future loadNetImage(String path) async {
    final data = await NetworkAssetBundle(Uri.parse(path)).load(path);
    final bytes = data.buffer.asUint8List();
    final imageD = await decodeImageFromList(bytes);
    image.value = imageD;
  }

class GlassPainter extends CustomPainter {
  final ui.Image image;
  final Size imageSize;
  final Paint _paint = Paint()
    ..color = Colors.white.withOpacity(0.8)
    ..style = PaintingStyle.fill
    ..imageFilter = ui.ImageFilter.blur(sigmaX: 10, sigmaY: 10, tileMode: TileMode.decal);

  GlassPainter(this.image, this.imageSize);

  @override
  void paint(Canvas canvas, Size size) {
    final Rect rect = Offset.zero & size;
    canvas.drawImageRect(image, Rect.fromLTWH(0, 0, imageSize.width, imageSize.height), rect, _paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}

加載本地、file滨砍、相冊圖片

// 本地資源圖片
Future loadIamge(String path) async {
  // 加載資源文件
  final data = await rootBundle.load(path);
  // 把資源文件轉(zhuǎn)換成Uint8List類型
  final bytes = data.buffer.asUint8List();
  // 解析Uint8List類型的數(shù)據(jù)圖片
  final image = await decodeImageFromList(bytes);
  this.image = image;
  setState(() {});
}

// 可繪制對象
Future loadLocalImage(String path) async {
  // 通過字節(jié)的方式讀取本地文件
  final bytes = await File(path).readAsBytes();
  // 解析圖片資源
  final image = await decodeImageFromList(bytes);
  this.image = image;
  setState(() {});
}

看代碼 我們發(fā)現(xiàn) 我們不使用系統(tǒng)提供給我們的封裝好的組件 我們選擇了 自己去繪制圖片同時設(shè)置畫筆的高斯模糊效果往湿,同樣是兩個圖片 看滑動的性能


優(yōu)化后

優(yōu)化后 滑動明顯好了很多,這只是兩個圖片 若是列表存在更多圖片的話 這種優(yōu)化會更明顯

寫在最后

性能有一個不小的提升 但是有個小問題 圖片沒有做緩存 這里還需要自己對圖片進行緩存處理 防止多次下載同一張圖片
據(jù)說Flutter版本3.22 對 ImageFillter性能做了優(yōu)化惋戏,目前我還沒有測試
有測試過的小伙伴 或是有更優(yōu)化方法 歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末领追,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子日川,更是在濱河造成了極大的恐慌蔓腐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龄句,死亡現(xiàn)場離奇詭異回论,居然都是意外死亡,警方通過查閱死者的電腦和手機分歇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門傀蓉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人职抡,你說我怎么就攤上這事葬燎。” “怎么了缚甩?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵谱净,是天一觀的道長。 經(jīng)常有香客問我擅威,道長壕探,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任郊丛,我火速辦了婚禮李请,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厉熟。我一直安慰自己导盅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布揍瑟。 她就那樣靜靜地躺著白翻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绢片。 梳的紋絲不亂的頭發(fā)上滤馍,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天恩急,我揣著相機與錄音,去河邊找鬼纪蜒。 笑死,一個胖子當(dāng)著我的面吹牛此叠,可吹牛的內(nèi)容都是我干的纯续。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灭袁,長吁一口氣:“原來是場噩夢啊……” “哼猬错!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茸歧,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倦炒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后软瞎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逢唤,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年涤浇,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳖藕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡只锭,死狀恐怖著恩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜻展,我是刑警寧澤喉誊,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站纵顾,受9級特大地震影響伍茄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜片挂,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一幻林、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧音念,春花似錦沪饺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讥脐,卻和暖如春遭居,著一層夾襖步出監(jiān)牢的瞬間啼器,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工俱萍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留端壳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓枪蘑,卻偏偏與公主長得像损谦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岳颇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容