flutter 图片编辑矩形 editBox
Posted 刘文_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter 图片编辑矩形 editBox相关的知识,希望对你有一定的参考价值。
实现一个四边可以拖拽 整体可以移动的 用于编辑图片的矩形框
初始矩形 可以滑动生成
长按四边区域 或着内部 进入编辑状态
代码如下
import 'package:flutter/material.dart';
class EditBox extends StatefulWidget
@override
_EditBoxState createState() => _EditBoxState();
class _EditBoxState extends State<EditBox>
BoxRect? boxRect = BoxRect(null, null, false);
BoxType boxType = BoxType.init;
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text('editBox'),
),
body: GestureDetector(
onPanDown: _onPanDown,
onPanEnd: _onPanEnd,
onPanUpdate: _onPanUpdate,
onLongPressMoveUpdate: _onMove,
onLongPressEnd: _onMoveEnd,
onLongPressStart: _onMoveStart,
child: CustomPaint(
painter: BoxPainter(boxRect!),
size: Size.infinite,
),
),
);
_onPanDown(DragDownDetails details)
if (boxType == BoxType.init)
boxRect!.start = details.localPosition;
setState(() );
_onPanUpdate(DragUpdateDetails details)
if (boxType == BoxType.init)
boxRect!.end = details.localPosition;
setState(() );
Offset? start;
Offset? end;
_onMoveStart(LongPressStartDetails details)
if (boxType == BoxType.greatOk)
start = boxRect!.start;
end = boxRect!.end;
var offset = details.localPosition;
if (boxRect!.rect1.contains(offset))
boxType = BoxType.moveBox1;
else if (boxRect!.rect2.contains(offset))
boxType = BoxType.moveBox2;
else if (boxRect!.rect3.contains(offset))
boxType = BoxType.moveBox3;
else if (boxRect!.rect4.contains(offset))
boxType = BoxType.moveBox4;
else if (boxRect!.rect.contains(offset))
boxType = BoxType.moveBox;
setState(() );
_onMove(LongPressMoveUpdateDetails details)
var offset = details.offsetFromOrigin;
switch (boxType)
case BoxType.moveBox:
boxRect!.start = Offset(start!.dx + offset.dx, start!.dy + offset.dy);
boxRect!.end = Offset(end!.dx + offset.dx, end!.dy + offset.dy);
break;
case BoxType.moveBox1:
boxRect!.start = Offset(start!.dx + offset.dx, start!.dy + offset.dy);
break;
case BoxType.moveBox2:
boxRect!.start = Offset(start!.dx, start!.dy + offset.dy);
boxRect!.end = Offset(end!.dx + offset.dx, end!.dy);
break;
case BoxType.moveBox3:
boxRect!.start = Offset(start!.dx + offset.dx, start!.dy);
boxRect!.end = Offset(end!.dx, end!.dy + offset.dy);
break;
case BoxType.moveBox4:
boxRect!.end = Offset(end!.dx + offset.dx, end!.dy + offset.dy);
break;
setState(() );
_onMoveEnd(LongPressEndDetails details)
boxType = BoxType.greatOk;
_onPanEnd(DragEndDetails details)
if (boxType == BoxType.init)
boxType = BoxType.greatOk;
boxRect!.needSide = true;
setState(() );
class BoxPainter extends CustomPainter
BoxPainter(this.boxRect);
BoxRect? boxRect;
@override
void paint(Canvas canvas, Size size)
Offset? start = boxRect!.start;
Offset? end = boxRect!.end;
if (start != null && end != null)
Paint paint = Paint()
..color = Colors.red
..style = PaintingStyle.stroke
..strokeWidth = 1;
Rect rect = boxRect!.rect;
canvas.drawRect(rect, paint);
if (boxRect!.needSide == true)
Paint paint = Paint()
..color = Colors.red
..style = PaintingStyle.fill;
canvas.drawRect(boxRect!.rect1, paint);
canvas.drawRect(boxRect!.rect2, paint);
canvas.drawRect(boxRect!.rect3, paint);
canvas.drawRect(boxRect!.rect4, paint);
@override
bool shouldRepaint(covariant CustomPainter oldDelegate)
// TODO: implement shouldRepaint
return true;
class BoxRect
BoxRect(this.start, this.end, this.needSide);
Offset? start;
Offset? end;
bool needSide;
Rect get rect
return Rect.fromLTRB(start!.dx, start!.dy, end!.dx, end!.dy);
Rect get rect1
return Rect.fromLTRB(start!.dx, start!.dy, start!.dx + 10, start!.dy + 10);
Rect get rect2
return Rect.fromLTRB(end!.dx - 10, start!.dy, end!.dx, start!.dy + 10);
Rect get rect3
return Rect.fromLTRB(start!.dx, end!.dy - 10, start!.dx + 10, end!.dy);
Rect get rect4
return Rect.fromLTRB(end!.dx - 10, end!.dy - 10, end!.dx, end!.dy);
enum BoxType
init,
greatOk,
moveBox,
moveBox1,
moveBox2,
moveBox3,
moveBox4,
直接引用此page即可
以上是关于flutter 图片编辑矩形 editBox的主要内容,如果未能解决你的问题,请参考以下文章