美文网首页IT@程序员猿媛一起来学Flutter~Android开发经验谈
Flutter 42: 图解页面截屏与本地保存小尝试

Flutter 42: 图解页面截屏与本地保存小尝试

作者: 阿策神奇 | 来源:发表于2019-04-23 20:44 被阅读27次

      小菜因特别需求想尝试一下 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 类型字节流,最终存储为 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 中添加读写权限,并手动在设备中打开,之后便可正常存储;


      小菜对文件存储还很不熟悉,对于动态申请权限方面也在学习过程中,会在今后的博客中逐渐整理,如有不对的地方请多多指导;以下是小菜公众号,欢迎闲来吐槽~


公众号

相关文章

  • Flutter 42: 图解页面截屏与本地保存小尝试

    小菜因特别需求想尝试一下 Flutter 页面截屏并将图片保存在本地的功能,记录一下尝试过程。 RepaintBo...

  • ios MobileVLCKit的截屏和录屏功能

    第一、截屏功能 项目需求,点击截屏按钮,对当前直播页面截屏并且保存到相册。 MobileVLCKit这个库本身有提...

  • 前端日常(项目里踩过的坑总结)

    页面截屏保存图片 截屏工具:html2canvas 转图片与保存,一开始用手动封装的 base64Img2Blob...

  • flutter:截屏

    1.flutter-截屏组件 2.flutter-截屏插件 3.flutter-iOS原生截屏 iOS代码 4.获...

  • 截屏并保存到本地

    1>截图 2> 保存图片 3>回调 4>使用Swift注意点:Swift由于是直接将OC转化成Swift语法的,所...

  • adb shell 截屏与录屏

    截屏 adb shell screencap -p /sdcard/screenhot.png 截屏并保存在指定目...

  • 安卓截图笔记

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后...

  • Android截屏方案

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后...

  • python 自动化截屏

    python 自动化截屏 网站页面功能 浏览器打开html 对浏览器页面进行截图 将截图保存到指定位置 selen...

  • ios截屏及保存图片到本地

    截取当前屏幕显示的内容,并保存在本地: 1、项目添加:Photos.framework,AssetsLibrary...

网友评论

    本文标题:Flutter 42: 图解页面截屏与本地保存小尝试

    本文链接:https://www.haomeiwen.com/subject/uqscgqtx.html