Matrix text animation

Matrix text animation DEFAULT


Do you remember The Matrix movies, that started coming out in 1999? Hopefully this movie franchise didn't give you a fear of virtual reality and AI. The thing I remember most from the movie was the really cool slow-motion video effects (from multiple angles) in the fight scenes. And the second most cool thing was the computer code scrolling/dripping/raining down from the top of the screen. It's this second cool thing that I decided to try to imitate with my own code - follow along to see how ...

First, here's a small example to get you into the spirit of things. Without any hints about how I have ordered/offset/colored the text, can you guess which (famous) text I used in this version of the animation? Feel free to leave your guess in the comments (I'll tell the answer at the end of the blog).

How about some hints? ... Here are some general rules I applied to my text file, to create the animation:

  • Each row of text goes in a single column.
  • The rows of text are ordered left-to-right in the animation, they same as they were ordered top-to-bottom in the text file.
  • The text line is angled 90 degrees, and each character is rotated -90 degrees (so you can read the text line from bottom-to-top).
  • I staggered the lines, such that each one starts at a slightly different place.
  • I padded the staggered lines with blanks, and set up the animation so it is an endless loop (no beginning and no ending).
  • The coloring is random (each line of text is randomly assigned 1 of the 4 color shades).

Knowing these rules, are you now able to read the animation, and figure out what the text is? (Give it a try!)

Now, let's dive into the SAS code! First, I wrote a macro (subroutine) that lets me pass in the name of the text file, and a few other parameters. This makes it easy to re-use the code, to animate other text files.

%macro do_matrix(textfile, maxlen, maxobs, ypix, nametext);

Next I read in the text file, and exclude a few of the short lines that often appear in my code (yes, I animate some of my code later on).

filename myfile "&textfile";
data textdata;
infile myfile ls=&maxlen pad;
length textline $ &maxlen;
input textline $ 1-&maxlen;
if trim(left(textline)) not in ('' '/*' '*/' 'run;' ';' 'quit;' 'quit; run;') then output;

I chop up the lines of text, and start each one at a different random position in the text, and pad the lines with spaces ('a0'x). This way, I can wrap them around from the top to the bottom of the screen.

data textdata; set textdata;
textline=translate(textline,'a0'x,' ');
startloc=.; startloc=int(ranuni(123)*&maxlen);
length modline $&maxlen;

I loop through the characters of each line, and keep calculating a different starting place, and chop the text off one end of the line, and append it to the other end. At each iteration, the counter is named 'loop'.

do loop = 2 to &maxlen by 1;

I generate a scatter plot, and annotate the text on it 'by loop', creating a different scatter plot for each frame of the animation. I suppress all the axes, and anything that looks like a scatter plot, so all you see is the animated text.

symbol1 value=none interpol=none color=black;
axis1 label=none c=gray33 style=0 major=none minor=none value=none;
proc gplot data=annotext /*anno=annotext*/;
by loop;
plot y*x=1 /
vaxis=axis1 haxis=axis1
des='' name="&name._&nametext";

And I use these options, to knit all the separate plots into a single gif animation.

options dev=sasprtc printerpath=gif animduration=.25 animloop=0
animoverlay=no animate=start center nobyline;

And here's a screen-capture of another animation. Can you guess which text file it was? The gif animation file was bigger than the 1MB maximum size to upload into the blog, but you can click the screen-capture to see the animation in a separate window. Also, here's a link to the full SAS code, if you're interested in creating a similar animation using text from your own text files.



The first animation was The Star Spangled Banner (National Anthem).

The second animation was the SAS code used to create the animation.


Tags black backgroundgif animationmoviespop culture


I recently found out it’s been over twenty years since the release of The Matrix. The digital rain of letters is probably known to almost everyone even those who haven’t watched the movie. Let’s give it a try and mimic this effect using Flutter.

Flutter matrix effect animation


Having seen a few videos of the effect, I can summarize it as follows:

  • It consists of numerous “character rains” that all start at the top of the screen with a random horizontal position
  • Every now and then a new rain spawns
  • The latest character is always white, the colors before are green and there is a gradient so that the first characters fade out
  • Background is black
  • The characters are random characters including letters, numbers and other characters
  • The vertical rains differ in the length (height) of visible characters


Let’s start with the implementation of a single vertical rain. Once we have that, we let the whole effect be a composition of multiple rains.

import 'package:flutter/material.dart'; class VerticalTextLine extends StatefulWidget { VerticalTextLine({ this.speed = 12.0, this.maxLength = 10, Key key }) : super(key: key); final double speed; final int maxLength; @override _VerticalTextLineState createState() => _VerticalTextLineState(); } class _VerticalTextLineState extends State<VerticalTextLine> { List<String> _characters = ['T', 'E', 'S', 'T']; @override Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: _getCharacters(), ); } List<Widget> _getCharacters() { List<Widget> textWidgets = []; for (var character in _characters) { textWidgets.add( Text(character, style: TextStyle(color: Colors.white),) ); } return textWidgets; } }

This is a very simple start. Just a widget that displays a static vertical line of text at the top of its container.

The constructor arguments are and , which will later determine, how quickly the rain runs down the screen and what the maximum length of the visible text is. This way we have a variance in position, speed and length.

Flutter matrix effect iteration 1

Now, instead of displaying a plain white text, we want the last character to be white and the text before that to have the above described gradient.

@override Widget build(BuildContext context) { List<Color> colors = [Colors.transparent,,, Colors.white]; double greenStart; double whiteStart = (_characters.length - 1) / (_characters.length); if (((_characters.length - _maxLength) / _characters.length) < 0.3) { greenStart = 0.3; } else { greenStart = (_characters.length - _maxLength) / _characters.length; } List<double> stops = [0, greenStart, whiteStart, whiteStart]; return _getShaderMask(stops, colors); } ShaderMask _getShaderMask(List<double> stops, List<Color> colors) { return ShaderMask( shaderCallback: (Rect bounds) { return LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: stops, colors: colors, ).createShader(bounds); }, blendMode: BlendMode.srcIn, child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: _getCharacters(), ) ); }

For the purpose of displaying the text as a gradient, we use something called a ShaderMask. This can be used to fade out the edge of a child. The parameter expects a function that receives a bounding rectangle and returns a Shader. Good thing the Gradient class provides a method. This enables us to control the shading behavior by using a .

We use n. That means: take the source (the child parameter) and use the destination ( return value) as a mask. This leads to the text staying the way it is with the gradient only defining its color.

The argument of a is a list of doubles that represent the relative position across the gradient, at which a certain color (which is defined at the same position in the argument) should begin. So if the list contained and and the list contained and , the gradient would start with white and interpolate to red until half of its height and would be red from there to the bottom.

We want it to start with transparent color and then interpolate to green (at the character that is located characters before the end of the column). This color should last until the penultimate visible character where it changes to white.

If the whole character list is smaller than , we just take 30 % as a static point for the green color to start.

Flutter matrix effect iteration 2

Next step is to turn this text with a static length into a growing column.

class _VerticalTextLineState extends State<VerticalTextLine> { int _maxLength; Duration _stepInterval; List<String> _characters = []; Timer timer; @override void initState() { _maxLength = widget.maxLength; _stepInterval = Duration(milliseconds: (1000 ~/ widget.speed)); _startTimer(); super.initState(); } void _startTimer() { timer = Timer.periodic(_stepInterval, (timer) { final _random = new Random(); final list = ['A', 'B', 'C']; String element = list[_random.nextInt(list.length)]; setState(() { _characters.add(element); }); }); } ...

is interpreted in the way that 1.0 means 1 character per second. So it’s the frequency of characters added per second.

Flutter matrix effect iteration 3

Instead of having a static list of allowed characters, we can also use a random int to create a String from a UTF character code:

String element = String.fromCharCode( _random.nextInt(512) );

Now we need to create a widget that composes multiple of our vertical text lines:

import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_matrix_effect/vertical_text_line_current.dart'; class MatrixEffect extends StatefulWidget { @override State<StatefulWidget> createState() { return _MatrixEffectState(); } } class _MatrixEffectState extends State<MatrixEffect> { List<Widget> _verticalLines = []; Timer timer; @override void initState() { _startTimer(); super.initState(); } @override Widget build(BuildContext context) { return Stack( children: _verticalLines ); } void _startTimer() { timer = Timer.periodic(Duration(milliseconds: 300), (timer) { setState(() { _verticalLines.add( _getVerticalTextLine(context) ); }); }); } @override void dispose() { timer.cancel(); super.dispose(); } Widget _getVerticalTextLine(BuildContext context) { Key key = GlobalKey(); return Positioned( key: key, left: Random().nextDouble() * MediaQuery.of(context).size.width, child: VerticalTextLine( speed: 1 + Random().nextDouble() * 9, maxLength: Random().nextInt(10) + 5 ), ); } }

Every 300 milliseconds, we add a new to the list.

Since we’re dealing with a list of widgets here, it’s mandatory to use the key parameter of the widgets we add. Otherwise, if we manipulated the list by removing one element, a reference would be missing which would result in no widget being properly removed from the list (and from the widget tree).

We place the rains by using a widget with a random parameter. Also, we let the speed vary from 1 to 10 and the maximum length from 5 to 15.

Flutter matrix effect iteration 4

We still have one problem: Every vertical text line we spawn, stays in the widget tree forever. It might fade out over time because of our gradient, but it will always occupy memory. This leads to the app becoming very laggy after a short period of time. We need the rain to decide when to disappear and tell its parent.

VerticalTextLine({ @required this.onFinished, this.speed = 12.0, this.maxLength = 10, Key key }) : super(key: key); final double speed; final int maxLength; final VoidCallback onFinished; ... void _startTimer() { timer = Timer.periodic(_stepInterval, (timer) { final _random = new Random(); String element = String.fromCharCode( _random.nextInt(512) ); final box = context.findRenderObject() as RenderBox; if (box.size.height > MediaQuery.of(context).size.height * 2) { widget.onFinished(); return; } setState(() { _characters.add(element); }); }); }

We achieve the above mentioned exit condition by using a callback that is being called from the vertical text line. The condition to disappear is when the size of the rendered widget (the column) is twice as high as the current screen height. This way, the moment of disappearing should be smooth enough not to be noticed by the viewer. The timer does not need to be cancelled manually, because we do this anyways.

The callback we provide to the looks as follows:

onFinished: () { setState(() { _verticalLines.removeWhere((element) { return element.key == key; }); }); },


Using a , a , a and a , we were able to quickly mimic the well-known visual effect from The Matrix.

Categories TutorialsTags Dart 2.9.0, Flutter 1.20.0, Matrix, UISours:
  1. King piccolo and piccolo
  2. Custom vw baja bug
  3. Fantasy wallpaper 1920x1080
  4. The constitution answer key

Matrix Text Effect – Photoshop Tutorial

How to Create Matrix Text Effect – Photoshop Tutorial for Beginners

Support the channel:

Make a donation of Cryptocurrency:


Devil PSD Photoshop Tutorials



Instagram :

Go to File – New
Document size that I used is 1280 x 720 pixels, transparent background.
Change the foreground color black and press Alt + Delete to fill the layer with black.
I’ll create a new text document in windows and drag a small photo in it to create some random text.
Select and Copy text ( right click – copy )
Go to Type Tool in Photoshop, click on a corner and drag.
Font – Courier New, Regular , 6pt, Crisp, Left Alignment, Green color #4EFF73, Toggle Text Orientation – Vertical. CTRL + V ( paste text )
Duplicate the Layer CTRL + J
Go to Windows – Character, set the leading 8pt, tracking 10
Duplicate the layer CTRL + J
Go to Windows – Character, set the leading 10pt, tracking 25
Go to Adjustments – Brightness/Contrast. Set the brightness 50, contrast 100
Rename the layers text 01, text 02, text 03.
Go to text 02 layer and create a layer mask
Go to Filter – Render – Clouds
Go to text 03 layer and create a layer mask
Go to Filter – Render – Clouds
Select the text layers ( CTRL and click on them )
Right click and Duplicate Layers
Merge text layes ( CTRL + E ) and rename the layer ‘blur’
Drag the layer on top the Layer 1
Go to Filter – Blur – Motion Blur: Angle 90, Distance 15px.
Go to Brush Tool and select a big brush. Select text 02 layer and brush
Do the same for text 03 layer. ( this will make the text darken in the area you brush it )
Create a new layer
Change the foreground color white and choose a small brush ( I used 10px) the same size as the text.
Use Shift to create the lines. Press Shift, click and drag the line.
Change the blend mode to Overlay
CTRL + J ( Duplicate Layer )
CTRL + T ( Transform Tool ) rotate the highlights to 180

Share and Subscribe!!

Alex Elisav

Duration: 00:09:05


photoshopPhotoshop Text EffectsPhotoshop Video Tutorials


He saw how my girl was sucking and my girlfriend was lying inactive. Potihoniku he crept up to her and began to rinse her. She pretended that nothing was happening because she was embarrassed. But the movement of the naltsy in the vagina had an effect.

Animation matrix text

Vagina, starting to fuck her. She, apparently, also did not want to stop and began to wave at me right there, sitting on my penis, which easily. Walked between the girl's current labia. With every push of mine, a moan of pleasure escaped the girl's lips.

How to Create the MATRIX Title ANIMATION (Premiere Pro Tutorial)

The dog quickly moves. In it and freezes and the camera switches to a close-up on which you can see how his penis falls out of the slave's pussy and the thick translucent sperm of the dog flows out behind him. At the end of the recording, Tanechka comes up almost tightly to the path along which people walk and, hiding behind the bushes, begins to masturbate her.

You will also be interested:

Yes, looking at yourself from the outside when fucking is very exciting. Here Natasha begins to suck at Yulka, who, biting her lip, fucks her with a huge strapon. So I join them, pull out the plug from Yulka and drive my dick.

587 588 589 590 591