/timeflow

Timeflow: my entry to the flutter create challenge, which won the best overall execution category.

Primary LanguageDartMIT LicenseMIT

Timeflow

My entry to the flutter create challenge by google. https://flutter.dev/create

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

tip 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

Packages

  1. Numberpicker for choosing the duration of the Timer https://pub.dev/packages/numberpicker

  2. Screen so that the screen stays awake during the animation https://pub.dev/packages/screen

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