Flutter生成长截图并保存在本地
xml中需要配置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--写入外部存储权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!--读取外部存储权限-->
yaml文件需要引入
permission_handler: ^8.1.1 # 权限控制插件 by Allen Su
image_gallery_saver: ^1.6.9 # 图片存储到相册插件 by Allen Su
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
class ScreenShotPage extends StatefulWidget {
@override
_ScreenShotPageState createState() => _ScreenShotPageState();
}
class _ScreenShotPageState extends State<ScreenShotPage> {
GlobalKey _repaintKey = GlobalKey(); // 可以获取到被截图组件状态的 GlobalKey
List<Uint8List> _images = [];
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(right: 10),
child: RepaintBoundary(
//而第二个参数就是你需要截取的组件,如下代码所示
key: _repaintKey,
child: Column(
children: [
Container(
width: double.infinity,
color: Color(0xffe8eaed),
child: Column(
children: <Widget>[Column(children: _listWidget())]),
),
Container(
height: 200,
),
InkWell(
onTap: () async {
_getImageData();
Uint8List data = await _getImageData();
_images.add(data);
_doSaveImage();
print("---------------");
print(_images[0]);
},
child: Text("22222222"),
),
],
)),
)),
);
}
///数组
List<Widget> _listWidget() {
List<Widget> _list = List();
for (int index = 0; index < 40; index ) {
_list
.add(Container(height: 30, child: Center(child: Text('屏幕截图$index'))));
}
return _list;
}
/// 获取截取图片的数据
Future<Uint8List> _getImageData() async {
BuildContext buildContext = _repaintKey.currentContext;
if (buildContext != null) {
RenderRepaintBoundary boundary = buildContext.findRenderObject();
// 第一次执行时,boundary.debugNeedsPaint 为 true,此时无法截图(如果为true时直接截图会报错)
if (boundary.debugNeedsPaint) {
// 延时一定时间后,boundary.debugNeedsPaint 会变为 false,然后可以正常执行截图的功能
await Future.delayed(Duration(milliseconds: 20));
// 重新调用方法
return _getImageData();
}
// 获取当前设备的像素比
double dpr = ui.window.devicePixelRatio;
// pixelRatio 代表截屏之后的模糊程度,因为不同设备的像素比不同
// 定义一个固定数值显然不是最佳方案,所以以当前设备的像素为目标值
ui.Image image = await boundary.toImage(pixelRatio: dpr);
ByteData byteData =
await image.toByteData(format: ui.ImageByteFormat.png);
Uint8List imageBytes = byteData.buffer.asUint8List();
// 返回图片的数据
return imageBytes;
}
}
/// 执行存储图片到本地相册
void _doSaveImage() async {
// 如果用户已授权存储权限
if (await Permission.storage.request().isGranted) {
Uint8List data = await _getImageData();
await ImageGallerySaver.saveImage(data);
} else {
// 没有存储权限时,弹出没有存储权限的弹窗
}
}
// 执行截图并显示到页面中
void _doScreenShots() async {
Uint8List data = await _getImageData();
_images.add(data);
setState(() {});
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbjibi
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01