fix: çift tıklama BoxFit cover/contain toggle
Some checks failed
Build Windows / build-windows (push) Has been cancelled
Some checks failed
Build Windows / build-windows (push) Has been cancelled
This commit is contained in:
@@ -14,30 +14,13 @@ class ImageCanvas extends StatefulWidget {
|
||||
class _ImageCanvasState extends State<ImageCanvas> {
|
||||
late TransformationController _controller;
|
||||
double _currentScale = 1.0;
|
||||
bool _isFilled = false; // false = fit, true = fill screen
|
||||
Size? _imageSize;
|
||||
Size? _viewportSize;
|
||||
bool _isFilled = false; // false=fit, true=cover
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_controller = TransformationController();
|
||||
_controller.addListener(_onTransformChanged);
|
||||
_loadImageSize();
|
||||
}
|
||||
|
||||
void _loadImageSize() {
|
||||
final image = Image.file(File(widget.filePath));
|
||||
image.image.resolve(const ImageConfiguration()).addListener(
|
||||
ImageStreamListener((info, _) {
|
||||
setState(() {
|
||||
_imageSize = Size(
|
||||
info.image.width.toDouble(),
|
||||
info.image.height.toDouble(),
|
||||
);
|
||||
});
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -45,7 +28,6 @@ class _ImageCanvasState extends State<ImageCanvas> {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
if (oldWidget.filePath != widget.filePath) {
|
||||
_resetView();
|
||||
_loadImageSize();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,31 +42,11 @@ class _ImageCanvasState extends State<ImageCanvas> {
|
||||
}
|
||||
|
||||
void _toggleFillFit() {
|
||||
if (_imageSize == null || _viewportSize == null) return;
|
||||
|
||||
if (_isFilled) {
|
||||
// Go to fit mode — reset transform
|
||||
setState(() {
|
||||
_isFilled = !_isFilled;
|
||||
_controller.value = Matrix4.identity();
|
||||
_currentScale = 1.0;
|
||||
_isFilled = false;
|
||||
} else {
|
||||
// Go to fill mode — scale to cover viewport
|
||||
final scaleX = _viewportSize!.width / _imageSize!.width;
|
||||
final scaleY = _viewportSize!.height / _imageSize!.height;
|
||||
final fillScale = scaleX > scaleY ? scaleX : scaleY;
|
||||
|
||||
// Center the image
|
||||
final offsetX = (_viewportSize!.width - _imageSize!.width * fillScale) / 2;
|
||||
final offsetY = (_viewportSize!.height - _imageSize!.height * fillScale) / 2;
|
||||
|
||||
_controller.value = Matrix4.identity()
|
||||
// ignore: deprecated_member_use
|
||||
..translate(offsetX, offsetY)
|
||||
// ignore: deprecated_member_use
|
||||
..scale(fillScale);
|
||||
_currentScale = fillScale;
|
||||
_isFilled = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _handleDoubleTap() {
|
||||
@@ -95,8 +57,6 @@ class _ImageCanvasState extends State<ImageCanvas> {
|
||||
final renderBox = context.findRenderObject() as RenderBox?;
|
||||
if (renderBox == null) return;
|
||||
|
||||
_viewportSize = renderBox.size;
|
||||
|
||||
final localPosition = renderBox.globalToLocal(event.position);
|
||||
|
||||
final delta = event.scrollDelta.dy;
|
||||
@@ -137,7 +97,6 @@ class _ImageCanvasState extends State<ImageCanvas> {
|
||||
Widget build(BuildContext context) {
|
||||
return LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
_viewportSize = Size(constraints.maxWidth, constraints.maxHeight);
|
||||
return Listener(
|
||||
onPointerSignal: (event) {
|
||||
if (event is PointerScrollEvent) {
|
||||
@@ -156,7 +115,7 @@ class _ImageCanvasState extends State<ImageCanvas> {
|
||||
child: Center(
|
||||
child: Image.file(
|
||||
File(widget.filePath),
|
||||
fit: BoxFit.contain,
|
||||
fit: _isFilled ? BoxFit.cover : BoxFit.contain,
|
||||
filterQuality: FilterQuality.high,
|
||||
errorBuilder: (context, error, stackTrace) {
|
||||
return const Center(
|
||||
|
||||
Reference in New Issue
Block a user