2/24/2019 Admin
Animation and Visual Effects in Blazor and Razor Components
SQL-MisterMagoo recently posted a GitHub Blazor and Razor Components example that demonstrates a compelling animation. In this post we will examine how he did it.

The main sample consists of animation controls and animation.
Get The Code

You can download the latest version of the example at this link:
https://github.com/SQL-MisterMagoo/MM.RazorComponents.Blocky

When you pull down the project and open it up in Visual Studio 2019 (or higher), you will see multiple projects.
Run The Sample

When we run the sample, we see that the sample is at route p4.

We can see that the p4 route leads to the Page4.cshtml control in the MM.RazorComponents.Blocky.App project, but all that page has on it is the PixelCssCascade control.

the PixelCssCascade control is in the MM.RazorComponents.Blocky.Shared project.
The PixelCssCascade Control

The markup for the control is very basic.
Essentially a collection of pixels is created.
The KeyframePixel control takes the values of each pixel and creates a random CSS (Cascading Style Sheets) style, based on the pixel values.
This style creates a circle and animates it on the screen using CSS positioning.

The code for the PixelCssCascade control creates the collection of pixels based on the values in the animation controls.
Each time the animation control values change, the ShouldRender method is called, and it triggers the Draw method, that is responsible for removing pixels (by calling the TrimPixels method), or calling the SpawnPixel method to create new ones.
Here are the variables that the control uses to control and manage the pixel values:
bool Redraw = true;
// The list of active pixels
List<PixelDTO> pixels;
// Task that controls refreshing the page
Task draw;
// Random number source for variations
Random random;
// Pixel spawn point
double EX, EY;
// Screen limits - should be read at runtime, but this is just a demo
const int SCREEN_WIDTH = 1900;
const int SCREEN_HEIGHT = 700;
Vector2D SpeedRange = new Vector2D(1000, 3000);
// Time (ms) between checks for new parameter values
int RefreshInterval = 500;
// Number of pixels spawned per interval : lower = fewer pixels, higher = more pixels
int SpawnPerInterval = 1;
// Maximum number of pixels allowed
int MaxPixelCount = 150;
// Initial pixel size
double InitialPixelSize = 10.0;
// Alter pixel size per frame : lower than 1 = reduce in size, higher than 1 = increase in size
double PixelScaleFactor = 3.0;
// Alter pixel alpha per frame : lower than 1 = reduce alpha, higher than 1 = increase alpha
double PixelAlphaFactor = 0.99;
// Alter X-axis movement delta per frame : deltaX *= DeltaXFactor
double DeltaXFactor = 1.11;
// Alter Y-axis movement delta per frame : deltaY += DeltaYFactor
double DeltaYFactor = 0.75;
double Hue = 1.0;
int pixelCount = 0;
The Pixel
When we look at a pixel, this is where Blazor / Razor Components really shines.
Not only is it just a C# class, but, it contains complex types for the properties like Colors and Vector2D.
This class is the exact same class and instance used for the procedure code and the presentation code.
public class PixelDTO
{
public Colors Colors;
public Vector2D Position;
public Vector2D Motion;
public Vector2D? StartPosition;
public Vector2D? ArcPosition;
public Vector2D? ScaleRange;
public Vector2D? OpacityRange;
public double Scale;
public bool ShouldDie { get; private set; }
public int Size => (int)Scale;
public void Die() => ShouldDie = true;
}
The KeyframePixel Control
The KeyframPixel control is essentially a control that has a single html paragraph label that has a class and a style that is animated/manipulated by the random animation defined in the style.
This is what makes the circles grow, and animate across the screen.

Animation Blazor / Razor Components Style
What this example essentially shows is that Blazor / Razor Components is capable of any of the features and performance of any of the other SPA (Single Page Application) frameworks such as Angular, React, or Vue.
In this case, it achieves the performance by simply setting up the animation, but allowing normal CSS animation to do the actual work.
Earlier versions of the code controlled the movement in a loop that was managed by the Razor Components code. This is much less preformat and you can see the results in the Pixel Cascade example in the same solution (see the MovePixel method).
