build: github acik kaynak hazirligi — LICENSE/CI/topluluk dosyalari eklendi, binary'ler takipten cikarildi, README EN, kok dokumanlar docs/'a tasindi

This commit is contained in:
Alhan committed 2026-08-06 05:49:43 +03:00
1 parent cd3f573f57
commit 8972ef7225
35 files changed
+560 -151

No files matched your search

+45
View File
@@ -0,0 +1,45 @@
# ImajViewer — Pan Sınırlama & Zoom Merkezi Sorunu ✅ ÇÖZÜLDÜ
> **Tarih:** 2026-07-23
> **Dosya:** `lib/widgets/image_canvas.dart`
> **Durum:** ✅ Çözüldü
---
## Nihai Çözüm
### 1. Zoom — `Matrix4.copy(m)..translate..scale..translate`
Cursor merkezli zoomAroundPoint. Hem fill hem fit modunda çalışır çünkü `localPosition` her zaman Listener'a göre doğru koordinat verir. `_currentScale` listener'da güncellenir.
### 2. `_clampAfterZoom` — Image offset + sadece boundary clamp
**Kritik:** Fit modunda (BoxFit.contain) Image, Center widget içinde **ortalanır**. Offset hesaplanarak image'ın viewport'taki gerçek sınırları bulunur:
```dart
imgOffsetX = (viewportW - imageW) / 2 // fill modunda 0, fit modunda >0
imgLeft = tx + imgOffsetX * scale
imgRight = tx + (imgOffsetX + imageW) * scale
```
**SADECE** image viewport'tan büyükse clamp yapılır. Küçükse **dokunulmaz** — zoom-around-point merkezi korunur. Kullanıcı double-tap ile istediği zaman ortalamayı sıfırlayabilir (`Matrix4.identity()`).
### 3. `translate` — asla `setTranslationRaw` kullanma
`setTranslationRaw` matrisin translation sütununu ezer → zoom merkezini bozar. `translate(dx,dy)` ekleme yapar → zoom merkezi korunur.
### 4. Listener'da clamp YOK
Sadece `_currentScale` takip edilir. Pan → `boundaryMargin: EdgeInsets.zero`, Zoom → `_handleScroll` içinde `_clampAfterZoom`.
---
## Akış
```
Scroll → _handleScroll → zoomAroundPoint → _controller.value
↓
_clampAfterZoom()
├─ image > viewport → translate ile clamp
└─ image ≤ viewport → dokunma
Pan → InteractiveViewer → _controller.value (boundaryMargin sınırlar)
↓
_onTransformChanged → sadece _currentScale
```