Flutter 42: 圖解頁面截屏與本地保存小嘗試

??????小菜因特別需求想嘗試一下 Flutter 頁面截屏并將圖片保存在本地的功能阅爽,記錄一下嘗試過程悦屏。

RepaintBoundary

??????Flutter 提供了支持截屏的 RepaintBoundary寞射,在需要截取部分的外層嵌套,也可以截取某一子 Widget 內容玻孟;RepaintBoundary 的結構很簡單缔杉,通過 key 來判斷截取的 RenderObject,最終生成一個 RenderRepaintBoundary 對象捏检;

const RepaintBoundary({ Key key, Widget child }) : super(key: key, child: child);

@override
Widget build(BuildContext context) {
  return RepaintBoundary(
      key: globalKey,
      child: Scaffold(
          body: Stack(children: <Widget>[
        Image.asset('img/bg.jpg', width: _w, fit: BoxFit.fill),
        Container(child: CustomPaint(painter: StarCanvas(_w, _h, p, s, st))),
        itemWid(1, 2),
        itemWid(1, 1),
        itemWid(0, 1),
        itemWid(0, 2),
      ])));
}

ui.Image

??????通過 RenderRepaintBoundary 獲取的對象 .toImage() 后轉為 ui.Image 類型字節(jié)流荞驴,最終存儲為 png 格式,在轉為常用的 Uint8List 存儲在內存中贯城,借助 image.memory() 方式展示在具體位置熊楼;而當前只是獲取到圖片的流信息,僅可用于操作能犯,還未存儲在本地鲫骗;

??????toByteData() 生成的數據格式一般分三種:

  1. rawRgba:未解碼的 byte
  2. rawUnmodified:未解碼且未修改的 byte踩晶,如灰度圖执泰;
  3. png 為我們常用的 PNG 圖片;
Future<Uint8List> _capturePng(globalKey) async {
  RenderRepaintBoundary boundary = globalKey.currentContext.findRenderObject();
  ui.Image image = await boundary.toImage();
  ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
  Uint8List picBytes = byteData.buffer.asUint8List();
  return picBytes;
}

Directory

??????若需要存儲本地渡蜻,跟 Android/iOS 類似术吝,首先獲取存儲路徑计济,再進行存儲操作;小菜借助三方插件 path_provider 來獲取圖片路徑排苍;

??????path_provider 提供了 getTemporaryDirectory 臨時路徑 / getApplicationDocumentsDirectory 全局路徑等沦寂,可以根據不同的需求存儲不同路徑;

??????小菜為了測試方便選擇存放在設備根目錄下 getExternalStorageDirectory淘衙;

Future<String> _capturePath(name) async {
  Directory documentsDirectory = await getExternalStorageDirectory();
  String path = join(documentsDirectory.path, name);
  return path;
}

writeAsBytes

??????文件的保存很簡單传藏,直接將 Uint8List 寫入到所在文件路徑下即可;

File(val).writeAsBytes(unitVal);

??????但此時存儲或自定義文件路徑彤守,可能會遇到權限問題毯侦,小菜為了測試方便在 Android 中添加讀寫權限,并手動在設備中打開具垫,之后便可正常存儲侈离;


??????小菜對文件存儲還很不熟悉,對于動態(tài)申請權限方面也在學習過程中筝蚕,會在今后的博客中逐漸整理霍狰,如有不對的地方請多多指導!

來源:阿策小和尚

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末饰及,一起剝皮案震驚了整個濱河市蔗坯,隨后出現的幾起案子,更是在濱河造成了極大的恐慌燎含,老刑警劉巖宾濒,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異屏箍,居然都是意外死亡绘梦,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赴魁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卸奉,“玉大人,你說我怎么就攤上這事颖御¢茫” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵潘拱,是天一觀的道長疹鳄。 經常有香客問我,道長芦岂,這世上最難降的妖魔是什么瘪弓? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮禽最,結果婚禮上腺怯,老公的妹妹穿的比我還像新娘袱饭。我一直安慰自己,他們只是感情好呛占,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布宁赤。 她就那樣靜靜地躺著,像睡著了一般栓票。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愕够,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天走贪,我揣著相機與錄音,去河邊找鬼惑芭。 笑死坠狡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的遂跟。 我是一名探鬼主播逃沿,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幻锁!你這毒婦竟也來了凯亮?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤哄尔,失蹤者是張志新(化名)和其女友劉穎假消,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體岭接,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡富拗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了鸣戴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啃沪。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窄锅,靈堂內的尸體忽然破棺而出创千,到底是詐尸還是另有隱情,我是刑警寧澤入偷,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布签餐,位于F島的核電站,受9級特大地震影響盯串,放射性物質發(fā)生泄漏氯檐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一体捏、第九天 我趴在偏房一處隱蔽的房頂上張望冠摄。 院中可真熱鬧糯崎,春花似錦、人聲如沸河泳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆挥。三九已至薄霜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纸兔,已是汗流浹背惰瓜。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汉矿,地道東北人崎坊。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像洲拇,于是被迫代替她去往敵國和親奈揍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程赋续,因...
    小菜c閱讀 6,358評論 0 17
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5男翰? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,424評論 1 45
  • 一纽乱、初識flutter image 在講解源碼之前奏篙,我們先看下面幾個例子,回顧一下flutter加載圖片資源的方式...
    五月_f6d4閱讀 11,169評論 3 23
  • ¥開啟¥ 【標題欄(ActionBar)】 〖2017-08-06 00:50:39〗 《標題欄(ActionBa...
    小菜c閱讀 1,235評論 0 5
  • 我們今天分享的主題是:臨在 臨在就是有覺察力的安住在當下迫淹,也就是活在當下的意思秘通,這里面有覺察力,有安住敛熬,在當下肺稀。 ...
    排列師劉紅蓮閱讀 345評論 0 3