私が構築したいのは、ズーム可能な動作と同様にその子ウィジェットをズーム可能にすることができるウィジェットです。
私はカバーしたいジェスチャーです
これが私のウィジェットプランです:
ZoomableWidget(
child: // My custom Widget which should be zoomable.
)
_
これが私の現在の進歩です:
import 'package:flutter/material.Dart';
import 'package:flutter/widgets.Dart';
import 'package:vector_math/vector_math_64.Dart';
class ZoomableWidget extends StatefulWidget {
final Widget child;
const ZoomableWidget({Key key, this.child}) : super(key: key);
@override
_ZoomableWidgetState createState() => _ZoomableWidgetState();
}
class _ZoomableWidgetState extends State<ZoomableWidget> {
double _scale = 1.0;
double _previousScale;
@override
Widget build(BuildContext context) {
return ClipRect(
child: GestureDetector(
onScaleStart: (ScaleStartDetails details) {
_previousScale = _scale;
},
onScaleUpdate: (ScaleUpdateDetails details) {
setState(() {
_scale = _previousScale * details.scale;
});
},
onScaleEnd: (ScaleEndDetails details) {
_previousScale = null;
},
child: Transform(
transform: Matrix4.diagonal3(Vector3(_scale.clamp(1.0, 5.0),
_scale.clamp(1.0, 5.0), _scale.clamp(1.0, 5.0))),
alignment: FractionalOffset.center,
child: widget.child,
),
),
);
}
}
_
私が直面している問題は、ピンチの中心を変更することはできません。また、ウィジェットをスクロールするには、水平ドラッグと垂直ドラッグにはアクセスできません。
前もって感謝します。
これは完全に機能しています、参照@pskinkをありがとう。
import 'package:flutter/material.Dart';
import 'package:matrix_gesture_detector/matrix_gesture_detector.Dart';
class ZoomableWidget extends StatefulWidget {
final Widget child;
const ZoomableWidget({Key key, this.child}) : super(key: key);
@override
_ZoomableWidgetState createState() => _ZoomableWidgetState();
}
class _ZoomableWidgetState extends State<ZoomableWidget> {
Matrix4 matrix = Matrix4.identity();
@override
Widget build(BuildContext context) {
return MatrixGestureDetector(
onMatrixUpdate: (Matrix4 m, Matrix4 tm, Matrix4 sm, Matrix4 rm) {
setState(() {
matrix = m;
});
},
child: Transform(
transform: matrix,
child: widget.child,
),
);
}
}
_
私は解像度が大好きです、あなたはPubで包装されたものであることを私のコードでも、私のコードでズームをリセットして回転をロックしたようにすることさえできるようにすることさえすることもできます。
_import 'package:flutter/material.Dart';
import 'package:matrix_gesture_detector/matrix_gesture_detector.Dart';
class ZoomableWidget extends StatefulWidget {
final Widget child;
const ZoomableWidget({Key key, this.child}) : super(key: key);
@override
_ZoomableWidgetState createState() => _ZoomableWidgetState();
}
class _ZoomableWidgetState extends State<ZoomableWidget> {
Matrix4 matrix = Matrix4.identity();
Matrix4 zerada = Matrix4.identity();
@override
Widget build(BuildContext context) {
return GestureDetector(
onDoubleTap: (){
setState(() {
matrix = zerada;
});
},
child: MatrixGestureDetector(
shouldRotate: false,
onMatrixUpdate: (Matrix4 m, Matrix4 tm, Matrix4 sm, Matrix4 rm) {
setState(() {
matrix = m;
});
},
child: Transform(
transform: matrix,
child: widget.child,
),
),
);
}
}
_
MatrixEgestureTectorの代わりに、Photo_viewパッケージを使用できます. https://pub.dev/packages/photo_view
スクリーンの制約が適しているため、子のオフスクリーン、最小/最大サイズを打つときのバウンス効果、および他の多くのオプションをドラッグできないため、画面の制限があります。
これはこのようなカスタムチャイルドで使用できます。
PhotoView.customChild(
child: <your widget>
)
_