|
|
|
|
A gentle animation that provides a calming experience to stressed developers.
|
|
|
|
|
|
|
|
|
|
Contributed as part of the Flutter Create 5K challenge by Fabian Stein.
|
|
|
|
|
|
|
|
|
|
Timers and stopwatches aren’t the most peaceful gadgets, often reminding us of
|
|
|
|
|
urgent tasks, deadlines and unpleasant appointments. Not in this case, Timeflow
|
|
|
|
|
is the epitome of pure tranquility, ideal for mindful activities: mediation,
|
|
|
|
|
yoga or exercise. The slow, breath like animation is free of sudden, abrupt
|
|
|
|
|
jumps and builds up to a Zen finish.
|
|
|
|
|
|
|
|
|
|
## Use
|
|
|
|
|
|
|
|
|
|
Tap the screen to start/pause the timer
|
|
|
|
|
|
|
|
|
|
when paused:
|
|
|
|
|
|
|
|
|
|
1. red button reset the timer and the animation
|
|
|
|
|
|
|
|
|
|
2. green button: resume the timer
|
|
|
|
|
|
|
|
|
|
when finished/startscreen:
|
|
|
|
|
|
|
|
|
|
1. blue button choose the desired timeframe
|
|
|
|
|
|
|
|
|
|
2. orange button randomize a new triangle mesh/color scheme
|
|
|
|
|
|
|
|
|
|
## Code description
|
|
|
|
|
|
|
|
|
|
Please run dartfmt for readability.
|
|
|
|
|
|
|
|
|
|
Some of the variable names are short and I have not used comments, because of the character limit, so here is an explanation.
|
|
|
|
|
|
|
|
|
|
### globals
|
|
|
|
|
|
|
|
|
|
triangles: the list of triangles that are animated
|
|
|
|
|
|
|
|
|
|
percent: how much of the timer is completed (from 0.0 to 1.0)
|
|
|
|
|
|
|
|
|
|
cTime: the time that is already gone by since the start of the timer (paused time is excluded)
|
|
|
|
|
|
|
|
|
|
dur: how long is the timer in Milliseconds
|
|
|
|
|
|
|
|
|
|
rng: the random number generator that is used throughout the program
|
|
|
|
|
|
|
|
|
|
rebuild: is an indicator that the triangles destination points should be rebuild
|
|
|
|
|
|
|
|
|
|
### class TM
|
|
|
|
|
The timer class that manages the state of the app
|
|
|
|
|
|
|
|
|
|
SI cState: tracks the change of the apps state: is the timer stopped, playing or paused
|
|
|
|
|
pTime: tracks when the ticker was paused
|
|
|
|
|
Ticker t: the ticker that calls the update function up every frame
|
|
|
|
|
up: function that updates the current time or stops the timer, when the duration is reached
|
|
|
|
|
|
|
|
|
|
press, pause, play, stop: callback functions, for the button presses
|
|
|
|
|
openDialog: callback function, opens the numberPickerDialog, which is used to pick the timer duration
|
|
|
|
|
build: returns the app, mainly the custom painter P is called
|
|
|
|
|
|
|
|
|
|
### class P
|
|
|
|
|
The custom painter, which draws the triangles
|
|
|
|
|
|
|
|
|
|
paint:
|
|
|
|
|
d = diameter of the circle is 2/3 of the width of the screen
|
|
|
|
|
1. if the triangles are not setup completely (rebuild == true) calculate the outer points of for every triangle setupdP this happens here, because the ratio of the screens has got be known
|
|
|
|
|
2. paint all triangles
|
|
|
|
|
shouldRepaint: every frame should be repainted
|
|
|
|
|
|
|
|
|
|
### class T
|
|
|
|
|
The triangle class
|
|
|
|
|
|
|
|
|
|
sP: the list of the starting points of the triangle (these are the points you see at the start of the animation)
|
|
|
|
|
dP: the list of destination points (the outer points, where the triangles wander to first, before they circle back to the starting point)
|
|
|
|
|
|
|
|
|
|
constructor: p1,p2,p3 are the starting points, c is the overall color scheme (blue, red, green etc.)
|
|
|
|
|
for the triangle a random color out of the color scheme is chosen: p.color = c[100 * (rng.nextInt(9) + 1)];
|
|
|
|
|
the rest of the function determines, if the triangle is in the circle, if it is, it is added to the triangles list, otherwise it is forgotten and should be freed by the garbage collector
|
|
|
|
|
|
|
|
|
|
setupdP: setup the destination points, choose a random x and y position on the screen
|
|
|
|
|
|
|
|
|
|
cP: gives back the current points of the triangle with respect to the timerstate, some trigonometry and interpolations happen here
|
|
|
|
|
this is responsible for the animations
|
|
|
|
|
1. alter the alpha repetitively:
|
|
|
|
|
2. alter the distance to the starting points, use a linear interpolation between the starting points sP and the destination points dP with respect to the percentage already done
|
|
|
|
|
3. alter the angle with respect to the starting points
|
|
|
|
|
4. alter the size of the triangles repetitively
|
|
|
|
|
|
|
|
|
|
### function setupT
|
|
|
|
|
setup the Triangles (starting positions + color scheme)
|
|
|
|
|
|
|
|
|
|
dim: dimensions of the “net”
|
|
|
|
|
1. make a net of points in the following manner:
|
|
|
|
|
. . . . .
|
|
|
|
|
. . . .
|
|
|
|
|
. . . . .
|
|
|
|
|
. . . .
|
|
|
|
|
. . . . .
|
|
|
|
|
. . . .
|
|
|
|
|
2. alter the points a little bit by randomization, so that the net is a little more intresting
|
|
|
|
|
3. connect the points to form triangles
|
|
|
|
|
4. randomize a color scheme for the triangles
|
|
|
|
|
|