fix: çift tıklama BoxFit cover/contain toggle
Some checks failed
Build Windows / build-windows (push) Has been cancelled

This commit is contained in:
Alhan
2026-07-22 05:14:25 +03:00
parent 31b1032661
commit 86a63e0bb6
4 changed files with 5 additions and 46 deletions

View File

@@ -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(