Flutter屏幕截图插件screenshot_maker的使用
Flutter屏幕截图插件screenshot_maker的使用
Screenshot_maker
是一个用于生成使用 Flutter 布局的图像的包。该插件允许你使用 Flutter 强大的布局系统来生成图像。你可以用它来创建适用于 App Store 和 Play Store 的截图。
使用
ScreenshotMaker
ScreenshotMaker
渲染子部件并根据指定的大小将其写入指定的文件。
通过将此部件传递给 runPkg
并将其作为 Flutter 应用程序运行在模拟器上,可以输出图像。使用的模拟器与输出大小无关。为了更容易调整布局,建议使用具有大显示屏的平板设备(如 iPad)。
目前,Android 模拟器和 Web 浏览器不能在开发机器上输出图像,因此请使用 iOS 模拟器。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:screenshot_maker/screenshot_maker.dart';
void main() {
runApp(
ScreenshotMaker(
// TODO: 写你的绝对路径。
outputFile: File('/Users/your_name/Desktop/simple.png'),
size: Size(500, 1000),
child: MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: Text('text'),
),
),
),
);
}
Simulated
Simulated
将你的 Flutter 应用嵌入到你指定的设备框架图像中并进行组合。
位置和大小由 innerScreenOffset
和 innerScreenSize
指定。
“凹口”等区域由 viewPadding
表示。
设备的分辨率由 originalLogicalScreenSize
表示。这需要用逻辑像素表示。
设备框架图像必须有透明的显示区域。此包中不包含设备框架图像,你需要自己准备。示例中有一个非常简单的图像(位于 example/assets
),但不建议在生产环境中使用。
使用 Simulated
时,请使用 runPkg
而不是 runApp
。这是为了确保正确应用 viewPadding
设置。
import 'package:flutter/material.dart';
import 'package:screenshot_maker/screenshot_maker.dart';
void main() {
// 使用 runPkg 而不是 runApp。
runPkg(
Directionality(
textDirection: TextDirection.ltr,
child: Simulated(
innerScreenSize: const Size(1658, 3588),
innerScreenOffset: const Size(116, 103),
originalLogicalScreenSize: const Size(414, 896),
deviceFrameImage: Image.asset('assets/example_device_frame.png'),
viewPadding:
const PhysicalViewPadding(left: 0, top: 68, right: 0, bottom: 66),
child: const MyAwesomeApp(),
),
),
);
}
class MyAwesomeApp extends StatelessWidget {
const MyAwesomeApp();
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("My Awesome App")),
body: ElevatedButton(child: Text('foobar'), onPressed: () {})));
}
}
完整示例
以下是完整的示例代码:
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:screenshot_maker/screenshot_maker.dart';
void main() {
runPkg(MakeScreenshotsContinuously());
}
class MakeScreenshotsContinuously extends StatefulWidget {
final sizes = <Size>[
Size(1242, 2688),
Size(1242, 2208),
Size(2048, 2732),
];
final outputFiles = <File>[
// TODO: 写你的绝对路径。
File('/Users/your_name/Desktop/out1.png'),
File('/Users/your_name/Desktop/out2.png'),
File('/Users/your_name/Desktop/out3.png'),
];
MakeScreenshotsContinuously({
Key? key,
}) : super(key: key);
[@override](/user/override)
_MakeScreenshotsContinuouslyState createState() => _MakeScreenshotsContinuouslyState();
}
class _MakeScreenshotsContinuouslyState extends State<MakeScreenshotsContinuously> {
late int index;
late Completer<void> completer;
late File outputFile;
late Size size;
[@override](/user/override)
void initState() {
super.initState();
index = 0;
completer = Completer();
outputFile = widget.outputFiles[index];
size = widget.sizes[index];
}
[@override](/user/override)
Widget build(BuildContext context) {
completer.future.then((_) {
if (index < widget.outputFiles.length - 1 && completer.isCompleted) {
setState(() {
++index;
completer = Completer();
outputFile = widget.outputFiles[index];
size = widget.sizes[index];
});
}
});
return ScreenshotMaker(
outputFile: outputFile,
size: size,
completer: completer,
child: Directionality(
textDirection: TextDirection.ltr,
child: Stack(
children: [
// 背景
Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Colors.purple[200]!, Colors.cyan[200]!],
),
),
),
Column(
children: [
Expanded(
flex: 1,
child: Center(
child: Text(
'You Can Do Everything with This App!',
style: TextStyle(
fontSize: 60,
color: Colors.white,
decoration: TextDecoration.none),
),
),
),
Expanded(
flex: 4,
child: Simulated(
innerScreenSize: const Size(1658, 3588),
innerScreenOffset: const Size(116, 103),
originalLogicalScreenSize: const Size(414, 896),
viewPadding: const PhysicalViewPadding(
left: 0, top: 68, right: 0, bottom: 66),
deviceFrameImage:
Image.asset('assets/example_device_frame.png'),
child: MyAwesomeApp(),
),
),
],
),
],
),
),
);
}
}
class MyAwesomeApp extends StatelessWidget {
const MyAwesomeApp();
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('My Awesome App'),
),
body: Center(
child: Text(
'foobar',
style: TextStyle(fontSize: 50),
)),
));
}
}
更多关于Flutter屏幕截图插件screenshot_maker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter屏幕截图插件screenshot_maker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
screenshot_maker
是一个 Flutter 插件,用于在 Flutter 应用中轻松生成屏幕截图。它可以帮助你在应用中捕获当前屏幕的内容,并将其保存为图像文件。以下是如何使用 screenshot_maker
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 screenshot_maker
插件的依赖:
dependencies:
flutter:
sdk: flutter
screenshot_maker: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 screenshot_maker
插件:
import 'package:screenshot_maker/screenshot_maker.dart';
3. 使用 ScreenshotMaker
捕获屏幕截图
你可以使用 ScreenshotMaker
类来捕获屏幕截图并保存为图像文件。
class MyHomePage extends StatelessWidget {
final ScreenshotMaker screenshotMaker = ScreenshotMaker();
Future<void> captureAndSaveScreenshot() async {
try {
// 捕获当前屏幕的截图
final imagePath = await screenshotMaker.captureAndSave();
// 打印保存的路径
print('Screenshot saved at: $imagePath');
} catch (e) {
print('Failed to capture screenshot: $e');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Screenshot Maker Example'),
),
body: Center(
child: ElevatedButton(
onPressed: captureAndSaveScreenshot,
child: Text('Capture Screenshot'),
),
),
);
}
}
4. 处理截图
screenshotMaker.captureAndSave()
方法会返回保存的截图文件的路径。你可以使用这个路径来进一步处理截图,比如显示它、上传到服务器等。
5. 权限处理
在 Android 和 iOS 上,保存文件可能需要特定的权限。请确保你的应用已经请求并获得了必要的权限。
-
Android: 需要在
AndroidManifest.xml
中添加写入外部存储的权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
iOS: 需要在
Info.plist
中添加照片库访问权限:<key>NSPhotoLibraryAddUsageDescription</key> <string>We need to save screenshots to your photo library</string>
6. 运行应用
运行你的 Flutter 应用,点击按钮来捕获并保存屏幕截图。截图文件将会保存在设备的默认图片目录中。
7. 其他功能
screenshot_maker
插件可能还提供其他功能,比如自定义保存路径、捕获特定部件等。你可以查看插件的文档或源代码来了解更多详细信息。
示例代码
以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'package:screenshot_maker/screenshot_maker.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Screenshot Maker Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
final ScreenshotMaker screenshotMaker = ScreenshotMaker();
Future<void> captureAndSaveScreenshot() async {
try {
final imagePath = await screenshotMaker.captureAndSave();
print('Screenshot saved at: $imagePath');
} catch (e) {
print('Failed to capture screenshot: $e');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Screenshot Maker Example'),
),
body: Center(
child: ElevatedButton(
onPressed: captureAndSaveScreenshot,
child: Text('Capture Screenshot'),
),
),
);
}
}