1
1
import 'dart:ui' ;
2
2
import 'package:flutter/material.dart' ;
3
3
4
+ import 'magnifier_painter.dart' ;
5
+
4
6
class Magnifier extends StatefulWidget {
5
7
const Magnifier ({
6
8
@required this .child,
7
9
@required this .position,
8
10
this .visible = true ,
9
- this .scale = 2.0 ,
10
- this .alignment = Alignment .topLeft,
11
- this .size = const Size (160 , 160 ),
12
- Key key
13
- }) : super (key: key);
11
+ this .scale = 1.5 ,
12
+ this .size = const Size (160 , 160 )
13
+ }) : assert (child != null );
14
14
15
15
final Widget child;
16
16
final Offset position;
17
17
final bool visible;
18
18
final double scale;
19
- final Alignment alignment;
20
19
final Size size;
21
20
22
21
@override
@@ -41,19 +40,6 @@ class _MagnifierState extends State<Magnifier> {
41
40
void didUpdateWidget (Magnifier oldWidget) {
42
41
super .didUpdateWidget (oldWidget);
43
42
44
- if (! widget.visible) {
45
- return ;
46
- }
47
-
48
- if (oldWidget.size != widget.size) {
49
- _magnifierSize = widget.size;
50
- }
51
-
52
- if (oldWidget.scale != widget.scale) {
53
- _scale = widget.scale;
54
- _matrix = Matrix4 .identity ()..scale (_scale);
55
- }
56
-
57
43
_calculateMatrix ();
58
44
}
59
45
@@ -62,7 +48,7 @@ class _MagnifierState extends State<Magnifier> {
62
48
return Stack (
63
49
children: [
64
50
widget.child,
65
- if (widget.visible)
51
+ if (widget.visible && widget.position != null )
66
52
_getMagnifier (context)
67
53
],
68
54
);
@@ -77,6 +63,11 @@ class _MagnifierState extends State<Magnifier> {
77
63
double newX = widget.position.dx - (_magnifierSize.width / 2 / _scale);
78
64
double newY = widget.position.dy - (_magnifierSize.height / 2 / _scale);
79
65
66
+ if (_bubbleCrossesMagnifier ()) {
67
+ final box = context.findRenderObject () as RenderBox ;
68
+ newX -= ((box.size.width - _magnifierSize.width) / _scale);
69
+ }
70
+
80
71
final Matrix4 updatedMatrix = Matrix4 .identity ()
81
72
..scale (_scale, _scale)
82
73
..translate (- newX, - newY);
@@ -87,7 +78,7 @@ class _MagnifierState extends State<Magnifier> {
87
78
88
79
Widget _getMagnifier (BuildContext context) {
89
80
return Align (
90
- alignment: widget.alignment ,
81
+ alignment: _getAlignment () ,
91
82
child: ClipOval (
92
83
child: BackdropFilter (
93
84
filter: ImageFilter .matrix (_matrix.storage),
@@ -101,34 +92,15 @@ class _MagnifierState extends State<Magnifier> {
101
92
),
102
93
);
103
94
}
104
- }
105
-
106
- class MagnifierPainter extends CustomPainter {
107
- const MagnifierPainter ({
108
- @required this .color,
109
- this .strokeWidth = 5
110
- });
111
95
112
- final double strokeWidth;
113
- final Color color;
96
+ Alignment _getAlignment () {
97
+ if (_bubbleCrossesMagnifier ()) {
98
+ return Alignment .topRight;
99
+ }
114
100
115
- @override
116
- void paint (Canvas canvas, Size size) {
117
- Paint paintObject = Paint ()
118
- ..style = PaintingStyle .stroke
119
- ..strokeWidth = strokeWidth
120
- ..color = color;
121
-
122
- canvas.drawCircle (
123
- size.center (
124
- Offset (0 , 0 )
125
- ),
126
- size.longestSide / 2 , paintObject
127
- );
101
+ return Alignment .topLeft;
128
102
}
129
103
130
- @override
131
- bool shouldRepaint (CustomPainter oldDelegate) {
132
- return true ;
133
- }
104
+ bool _bubbleCrossesMagnifier () => widget.position.dx < widget.size.width &&
105
+ widget.position.dy < widget.size.height;
134
106
}
0 commit comments