Canvas Chop颤振画布/渲染器
我想访问元素的Canvas Chop颤振画布/渲染器,canvas,dart,flutter,Canvas,Dart,Flutter,我想访问元素的renderBox,并将其分解成小块 我正在寻找我是否能拥有元素并操纵它的绘画 我正在搜索如何将元素转换为pixal数组或画布并重建它 像那样的东西,但在飘动 我不知道如何处理它。您可以检查此代码,它正在工作 import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends St
renderBox
,并将其分解成小块
我正在寻找我是否能拥有元素并操纵它的绘画
我正在搜索如何将元素转换为pixal数组
或画布
并重建它
像那样的东西,但在飘动
我不知道如何处理它。您可以检查此代码,它正在工作
import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Photo Puzzle Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Image image;
//double imageHeight;
//double imageWidth;
String networkImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0ddb_rBz3oewknk6NSRvHhcds1sC9csScoaASWGFiLBytKcdvpg";
@override
void initState() {
super.initState();
image = Image.network(networkImage);
// rootBundle.load("assets/amrdiab.jpg").then((bd) {
// setState(() {
// Uint8List lst = new Uint8List.view(bd.buffer);
// print(lst);
// print(lst.length);
// //image = Image.memory(lst);
//
// });
//
// });
}
@override
Widget build(BuildContext context) {
final maxColumns = 10;
final maxRows = 10;
final piecesCount = maxColumns * maxRows;
assert(maxColumns>1,"Columns must be more than 1!");
assert(maxRows>1,"Rows must be more than 1!");
return Scaffold(
backgroundColor: Color(0xFFF6F6F6),
appBar: AppBar(backgroundColor: Color(0xFFF6F6F6), elevation: 0),
body: Column(
children: <Widget>[
Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
padding: const EdgeInsets.all(4.0),
itemCount: piecesCount,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: maxColumns,
childAspectRatio: maxRows/maxColumns,
mainAxisSpacing: 1.0,
crossAxisSpacing: 1.0,
),
itemBuilder: (BuildContext context, int index) {
final dx = index%maxColumns;
final dy = (index/maxColumns).floor();
print("dx = $dx dy = $dy");
return Container(
color: Colors.lightBlue,
alignment: Alignment.center,
child: Transform(
alignment: Alignment.center,
transform: Matrix4.diagonal3Values(max(maxColumns,maxRows).toDouble(),
max(maxRows,maxColumns).toDouble(), 1.0),
child: ClipRect(
child: Align(
//alignment: Alignment(-1, -1),
alignment: Alignment(-1+(2/(maxColumns-1))*dx,-1+(2/(maxRows-1))*dy),
widthFactor: 1/maxColumns,
heightFactor: 1/maxRows,
child: image,
),
),
),
);
}),
),
],
));
}
}
然后通过将边界转换为
形象
然后,您可以使用此数组直接绘制到画布中,这也很容易
问题是你如何操作这个数组或者做所谓的图像处理,理论上这是可行的,但就我所知,你肯定需要一个完整的包来处理颤振无法使用的东西,尽管如我前面所解释的,可以将一个小部件切碎,我仍在寻找解决方案。我想知道我是否可以购买任何小部件,而不仅仅是照片。我想操纵正在绘制的画布painted@Mohamedhassankadri任何小部件都可以用来代替图像,都是小部件,再次检查代码,您将找到文本小部件示例的添加部分。@Mohamedhassankadri检查如何将小部件转换为ByteArray的编辑部分。
import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Photo Puzzle Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Image image;
String networkImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS0ddb_rBz3oewknk6NSRvHhcds1sC9csScoaASWGFiLBytKcdvpg";
@override
void initState() {
super.initState();
image = Image.network(networkImage);
}
@override
Widget build(BuildContext context) {
final maxColumns = 3;
final maxRows = 3;
final piecesCount = maxColumns * maxRows;
assert(maxColumns>1,"Columns must be more than 1!");
assert(maxRows>1,"Rows must be more than 1!");
return Scaffold(
backgroundColor: Color(0xFFF6F6F6),
appBar: AppBar(backgroundColor: Color(0xFFF6F6F6), elevation: 0),
body: Column(
children: <Widget>[
Text("Hi there, I am a text widget, and can be choped into pieces:)",
style: TextStyle(fontSize: 24.0),),
Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
padding: const EdgeInsets.all(4.0),
itemCount: piecesCount,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: maxColumns,
childAspectRatio: 7.0,
mainAxisSpacing: 1.0,
crossAxisSpacing: 1.0,
),
itemBuilder: (BuildContext context, int index) {
final dx = index%maxColumns;
final dy = (index/maxColumns).floor();
print("dx = $dx dy = $dy");
return Container(
color: Colors.lightBlue,
alignment: Alignment.center,
child: Transform(
alignment: Alignment.center,
transform: Matrix4.diagonal3Values(
//1.0,1.0,
max(maxColumns,maxRows).toDouble(),
max(maxRows,maxColumns).toDouble(),
1.0),
child: ClipRect(
child: Align(
//alignment: Alignment(-1, -1),
alignment: Alignment(-1+(2/(maxColumns-1))*dx,-1+(2/(maxRows-1))*dy),
widthFactor: 1/maxColumns,
heightFactor: 1/maxRows,
//child: image,
child: Text("Hi there, I am a text widget, and can be choped into pieces:)",
style: TextStyle(fontSize: 8.0),
),
),
),
),
);
}),
),
],
));
}
}
var scr= new GlobalKey();
RepaintBoundary(
key: scr,
child: new FlutterLogo(size: 50.0,))
takescrshot() async {
RenderRepaintBoundary boundary = scr.currentContext.findRenderObject();
var image = await boundary.toImage();
var byteData = await image.toByteData(format: ImageByteFormat.png);
var pngBytes = byteData.buffer.asUint8List();
print(pngBytes);
}