Refactor: Ajustement des valeurs limites de taille (0.5 à 1.1) pour synchroniser le slider et le geste tactile
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
/// Les anneaux sont répartis proportionnellement.
|
||||
library;
|
||||
|
||||
import 'dart:math' as math;
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../core/theme/app_theme.dart';
|
||||
import '../../../data/models/target_type.dart';
|
||||
@@ -57,6 +58,9 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
// Contrôle de l'affichage du scroll d'espacement (désactivé par défaut)
|
||||
bool _showEspacement = false;
|
||||
|
||||
// Variable temporaire pour stocker la valeur du rayon au début du pincement tactile
|
||||
double _baseRadiusBeforeScale = 1.0;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -125,10 +129,22 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
|
||||
return Stack(
|
||||
children: [
|
||||
// Utilisation d'un Gesture Detector basé sur le Scale pour synchroniser à 1 ou 2 doigts
|
||||
GestureDetector(
|
||||
onPanStart: (details) => _onPanStart(details, size),
|
||||
onPanUpdate: (details) => _onPanUpdate(details, size),
|
||||
onPanEnd: (_) => _onPanEnd(),
|
||||
onScaleStart: (details) {
|
||||
_baseRadiusBeforeScale = _radius;
|
||||
final tapX = details.localFocalPoint.dx / size.width;
|
||||
final tapY = details.localFocalPoint.dy / size.height;
|
||||
final distToCenter = _distance(tapX, tapY, _centerX, _centerY);
|
||||
|
||||
if (distToCenter < 0.05 || distToCenter < _radius + 0.02) {
|
||||
setState(() {
|
||||
_isDraggingCenter = true;
|
||||
});
|
||||
}
|
||||
},
|
||||
onScaleUpdate: (details) => _onScaleUpdate(details, size),
|
||||
onScaleEnd: (_) => _onScaleEnd(),
|
||||
child: CustomPaint(
|
||||
size: size,
|
||||
painter: _CalibrationPainter(
|
||||
@@ -156,7 +172,7 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
children: [
|
||||
// Ligne d'activation pour afficher ou masquer l'espacement
|
||||
Container(
|
||||
margin: const EdgeInsets.only(bottom: 8), // CORRECTION de la syntaxe de marge
|
||||
margin: const EdgeInsets.only(bottom: 8),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 2),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.black54,
|
||||
@@ -173,7 +189,7 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
height: 28,
|
||||
child: Switch(
|
||||
value: _showEspacement,
|
||||
activeThumbColor: const Color(0xFF00FF00), // CORRECTION du paramètre déprécié
|
||||
activeThumbColor: const Color(0xFF00FF00),
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
_showEspacement = value;
|
||||
@@ -198,9 +214,9 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
const Icon(Icons.zoom_out, color: Colors.white, size: 16),
|
||||
Expanded(
|
||||
child: Slider(
|
||||
value: _radius.clamp(0.3, 1.2),
|
||||
min: 0.3,
|
||||
max: 1.2,
|
||||
value: _radius.clamp(0.5, 1.1),
|
||||
min: 0.5,
|
||||
max: 1.1,
|
||||
activeColor: AppTheme.primaryColor,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
@@ -332,25 +348,17 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
_notifyChange();
|
||||
}
|
||||
|
||||
void _onPanStart(DragStartDetails details, Size size) {
|
||||
final tapX = details.localPosition.dx / size.width;
|
||||
final tapY = details.localPosition.dy / size.height;
|
||||
|
||||
final distToCenter = _distance(tapX, tapY, _centerX, _centerY);
|
||||
|
||||
if (distToCenter < 0.05 || distToCenter < _radius + 0.02) {
|
||||
setState(() {
|
||||
_isDraggingCenter = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _onPanUpdate(DragUpdateDetails details, Size size) {
|
||||
final deltaX = details.delta.dx / size.width;
|
||||
final deltaY = details.delta.dy / size.height;
|
||||
|
||||
// Traitement intelligent des gestes tactiles
|
||||
void _onScaleUpdate(ScaleUpdateDetails details, Size size) {
|
||||
setState(() {
|
||||
if (_isDraggingCenter) {
|
||||
if (details.pointerCount == 2) {
|
||||
// GESTE À DEUX DOIGTS : On calcule le zoom en respectant le range strict (0.3 à 1.2)
|
||||
_radius = (_baseRadiusBeforeScale * details.scale).clamp(0.5, 1.1);
|
||||
_initRingRadii(forceRecalculate: true);
|
||||
} else if (_isDraggingCenter) {
|
||||
// GESTE À UN SEUL DOIGT : Déplacement fluide du centre de la cible
|
||||
final deltaX = details.focalPointDelta.dx / size.width;
|
||||
final deltaY = details.focalPointDelta.dy / size.height;
|
||||
_centerX = _centerX + deltaX;
|
||||
_centerY = _centerY + deltaY;
|
||||
}
|
||||
@@ -359,7 +367,7 @@ class TargetCalibrationState extends State<TargetCalibration> {
|
||||
_notifyChange();
|
||||
}
|
||||
|
||||
void _onPanEnd() {
|
||||
void _onScaleEnd() {
|
||||
setState(() {
|
||||
_isDraggingCenter = false;
|
||||
_isDraggingRadius = false;
|
||||
|
||||
Reference in New Issue
Block a user