Flutter 在InteractiveViewer中的图像上写入
我正在寻找编辑图像的简单方法, 或者在图像上书写,这样就不必管理我使用的缩放和滚动Flutter 在InteractiveViewer中的图像上写入,flutter,Flutter,我正在寻找编辑图像的简单方法, 或者在图像上书写,这样就不必管理我使用的缩放和滚动 import 'package:flutter/material.dart'; void main() =>runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State&
import 'package:flutter/material.dart';
void main() =>runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Center(child:MyInteractiveViewer("Assets/img/carte.png"),),
);
}
}
class MyInteractiveViewer extends InteractiveViewer {
MyInteractiveViewer(String carte):super(
constrained :false,
child: Image.asset(carte),
minScale:0.10,
maxScale:100.0){
init();}
void init(){
print ("test"+child.toString());
}
}
谢谢您的反馈我回答我的问题
我没有找到答案,但我提出了一个解决方案
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async';
import 'dart:typed_data';
void main() =>runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String carte = "Assets/img/carte.png";
ui.Image image;
bool isImageloaded = false;
TransformationController controller;
void initState() {
super.initState(); //init state
init();// inii image load
}
Future <Null> init() async {
Matrix4 matrix4 = Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
controller = TransformationController(matrix4);
final ByteData data = await rootBundle.load(carte);
image = await loadImage(new Uint8List.view(data.buffer));
}
Future<ui.Image> loadImage(List<int> img) async {
final Completer<ui.Image> completer = new Completer();
ui.decodeImageFromList(img, (ui.Image img) {
setState(() {
isImageloaded = true;
});
return completer.complete(img);
});
return completer.future;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: InteractiveViewer(
transformationController: controller,//pas très utile mais bon
minScale:0.1,
maxScale:5,
constrained :false,
child: CustomPaint(
size: Size(image.width.toDouble(), image.height.toDouble()),
foregroundPainter: TestPainter(image),
),
),
),
),
);
}
}
class TestPainter extends CustomPainter {
final ui.Image image;
TestPainter(this.image);
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.blueGrey;
canvas.drawImage(image, new Offset(0.0, 0.0), paint);
canvas.drawCircle(Offset(400, 800), 50, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
导入“包装:颤振/材料.省道”;
将“dart:ui”导入为ui;
导入“包:flatter/services.dart”显示根包;
导入“dart:async”;
导入“dart:键入的_数据”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
字符串carte=“Assets/img/carte.png”;
ui.图像;
bool-isimageload=false;
变换控制器;
void initState(){
super.initState();//init state
init();//inii图像加载
}
Future init()异步{
Matrix4 Matrix4=Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
控制器=转换控制器(matrix4);
最终ByteData数据=等待rootBundle.load(carte);
image=wait loadImage(新的Uint8List.view(data.buffer));
}
未来加载映像(列表img)异步{
最终完成者完成者=新完成者();
ui.decodeMageFromList(img,(ui.Image img){
设置状态(){
isImageloaded=true;
});
返回完成符。完成(img);
});
返回completer.future;
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
正文:中(
子:InteractiveViewer(
转换控制器:控制器,//pas très utile mais bon
最小刻度:0.1,
最大刻度:5,
答案:错,
孩子:定制油漆(
大小:大小(image.width.toDouble(),image.height.toDouble()),
前景画家:测试画家(图片),
),
),
),
),
);
}
}
类TestPainter扩展了CustomPainter{
最终用户界面。图像;
TestPainter(this.image);
@凌驾
空心油漆(帆布,尺寸){
最终油漆=油漆()
…颜色=颜色。蓝灰色;
画布.drawImage(图像,新偏移量(0.0,0.0),绘制);
帆布。画圈(偏移量(400800),50,油漆);
}
@凌驾
bool应重新绘制(自定义代理){
返回true;
}
}
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async';
import 'dart:typed_data';
void main() =>runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String carte = "Assets/img/carte.png";
ui.Image image;
bool isImageloaded = false;
TransformationController controller;
void initState() {
super.initState(); //init state
init();// inii image load
}
Future <Null> init() async {
Matrix4 matrix4 = Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
controller = TransformationController(matrix4);
final ByteData data = await rootBundle.load(carte);
image = await loadImage(new Uint8List.view(data.buffer));
}
Future<ui.Image> loadImage(List<int> img) async {
final Completer<ui.Image> completer = new Completer();
ui.decodeImageFromList(img, (ui.Image img) {
setState(() {
isImageloaded = true;
});
return completer.complete(img);
});
return completer.future;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: InteractiveViewer(
transformationController: controller,//pas très utile mais bon
minScale:0.1,
maxScale:5,
constrained :false,
child: CustomPaint(
size: Size(image.width.toDouble(), image.height.toDouble()),
foregroundPainter: TestPainter(image),
),
),
),
),
);
}
}
class TestPainter extends CustomPainter {
final ui.Image image;
TestPainter(this.image);
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.blueGrey;
canvas.drawImage(image, new Offset(0.0, 0.0), paint);
canvas.drawCircle(Offset(400, 800), 50, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}