|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
import 'dart:math';
|
|
|
|
|
import 'dart:ui' as ui;
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'package:smartfit_app_mobile/modele/user.dart';
|
|
|
|
|
import 'package:smartfit_app_mobile/common/colo_extension.dart';
|
|
|
|
|
|
|
|
|
|
class Graph extends StatelessWidget {
|
|
|
|
@ -28,17 +29,6 @@ class _GraphAreaState extends State<GraphArea>
|
|
|
|
|
with SingleTickerProviderStateMixin {
|
|
|
|
|
late AnimationController _animationController;
|
|
|
|
|
|
|
|
|
|
List<DataPoint> data = [
|
|
|
|
|
DataPoint(day: 1, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 2, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 3, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 4, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 5, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 6, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 7, steps: Random().nextInt(70)),
|
|
|
|
|
DataPoint(day: 8, steps: Random().nextInt(70)),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
@ -55,12 +45,16 @@ class _GraphAreaState extends State<GraphArea>
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
List<DataPoint> vitesseSecondes = Provider.of<User>(context, listen: false)
|
|
|
|
|
.listActivity[0]
|
|
|
|
|
.getSpeedWithTimeActivity();
|
|
|
|
|
|
|
|
|
|
return GestureDetector(
|
|
|
|
|
onTap: () {
|
|
|
|
|
_animationController.forward(from: 0.0);
|
|
|
|
|
},
|
|
|
|
|
child: CustomPaint(
|
|
|
|
|
painter: GraphPainter(_animationController.view, data: data),
|
|
|
|
|
painter: GraphPainter(_animationController.view, data: vitesseSecondes),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
@ -93,8 +87,8 @@ class GraphPainter extends CustomPainter {
|
|
|
|
|
var xSpacing = size.width / (data.length - 1);
|
|
|
|
|
|
|
|
|
|
var maxSteps = data
|
|
|
|
|
.fold<DataPoint>(data[0], (p, c) => p.steps > c.steps ? p : c)
|
|
|
|
|
.steps;
|
|
|
|
|
.fold<DataPoint>(data[0], (p, c) => p.speed > c.speed ? p : c)
|
|
|
|
|
.speed;
|
|
|
|
|
|
|
|
|
|
var yRatio = size.height / maxSteps;
|
|
|
|
|
var curveOffset = xSpacing * 0.3;
|
|
|
|
@ -103,7 +97,7 @@ class GraphPainter extends CustomPainter {
|
|
|
|
|
|
|
|
|
|
var cx = 0.0;
|
|
|
|
|
for (int i = 0; i < data.length; i++) {
|
|
|
|
|
var y = size.height - (data[i].steps * yRatio * _size.value);
|
|
|
|
|
var y = size.height - (data[i].speed * yRatio * _size.value);
|
|
|
|
|
|
|
|
|
|
offsets.add(Offset(cx, y));
|
|
|
|
|
cx += xSpacing;
|
|
|
|
@ -133,7 +127,7 @@ class GraphPainter extends CustomPainter {
|
|
|
|
|
..style = PaintingStyle.fill;
|
|
|
|
|
|
|
|
|
|
Paint dotOutlinePaint = Paint()
|
|
|
|
|
..color = Colors.white.withAlpha(200)
|
|
|
|
|
..color = ui.Color.fromARGB(255, 236, 236, 236).withAlpha(200)
|
|
|
|
|
..strokeWidth = 8;
|
|
|
|
|
|
|
|
|
|
Paint dotCenter = Paint()
|
|
|
|
@ -166,8 +160,21 @@ class GraphPainter extends CustomPainter {
|
|
|
|
|
canvas.drawPath(linePath, shadowPaint);
|
|
|
|
|
canvas.drawPath(linePath, linePaint);
|
|
|
|
|
|
|
|
|
|
canvas.drawCircle(offsets[4], 15 * _dotSize.value, dotOutlinePaint);
|
|
|
|
|
canvas.drawCircle(offsets[4], 6 * _dotSize.value, dotCenter);
|
|
|
|
|
int maxIndex = 0;
|
|
|
|
|
double maxY = offsets[0]
|
|
|
|
|
.dy; // Supposons que la première coordonnée est la plus grande
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i < offsets.length; i++) {
|
|
|
|
|
if (offsets[i].dy < maxY) {
|
|
|
|
|
maxIndex = i;
|
|
|
|
|
maxY = offsets[i].dy;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maintenant, maxIndex contient l'indice de la coordonnée maximale dans la liste offsets
|
|
|
|
|
// Utilisez ces coordonnées pour dessiner le point
|
|
|
|
|
canvas.drawCircle(offsets[maxIndex], 15 * _dotSize.value, dotOutlinePaint);
|
|
|
|
|
canvas.drawCircle(offsets[maxIndex], 6 * _dotSize.value, dotCenter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@ -177,11 +184,11 @@ class GraphPainter extends CustomPainter {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class DataPoint {
|
|
|
|
|
final int day;
|
|
|
|
|
final int steps;
|
|
|
|
|
|
|
|
|
|
DataPoint({
|
|
|
|
|
required this.day,
|
|
|
|
|
required this.steps,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
final double time;
|
|
|
|
|
final double speed;
|
|
|
|
|
|
|
|
|
|
DataPoint(
|
|
|
|
|
this.time,
|
|
|
|
|
this.speed,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|