Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/roipeker/graphx

GraphX package for Flutter.
https://github.com/roipeker/graphx

custompainter dart flutter graphx

Last synced: about 2 months ago
JSON representation

GraphX package for Flutter.

Lists

README

        

![GraphX™](https://raw.githubusercontent.com/roipeker/graphx/master/example/assets/graphx_logo.svg?sanitize=true)

[![pub package](https://img.shields.io/pub/v/graphx.svg?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGQ9Ik0xNiAtMS4zOTg3NmUtMDZMNDggMEw0OCAyNS41OTM4TDQxLjU5MzcgMjUuNTkzN0w0MS41OTM3IDYuMzk4NDRMMjIuMzk4NCA2LjM5ODQ0TDIyLjM5ODQgMTkuMTk1M0wyOC43OTY5IDE5LjE5NTNMMjguNzk2OSAxMi43OTY5TDM1LjE5NTMgMTIuNzk2OUwzNS4xOTUzIDI1LjU5MzdMMTYgMjUuNTkzN0wxNiAtMS4zOTg3NmUtMDZaIiBmaWxsPSIjNDBDNEZGIi8+CjxwYXRoIGQ9Ik0xNiAzMkwyMi4zOTg0IDMyTDIyLjM5ODQgMzguMzk4NEwxNiAzOC4zOTg0TDE2IDMyWk0xNiA1Ny41OTM3TDIyLjM5ODQgNTcuNTkzN0wyMi4zOTg0IDY0TDE2IDY0TDE2IDU3LjU5MzdaTTIyLjM5ODQgMzguMzk4NEwyOC43OTY5IDM4LjM5ODRMMjguNzk2OSA0NC43OTY5TDIyLjM5ODQgNDQuNzk2OUwyMi4zOTg0IDM4LjM5ODRaTTIyLjM5ODQgNTEuMTk1M0wyOC43OTY5IDUxLjE5NTNMMjguNzk2OSA1Ny41OTM3TDIyLjM5ODQgNTcuNTkzN0wyMi4zOTg0IDUxLjE5NTNaTTI4Ljc5NjkgNDQuNzk2OUwzNS4xOTUzIDQ0Ljc5NjlMMzUuMTk1MyA1MS4xOTUzTDI4Ljc5NjkgNTEuMTk1M0wyOC43OTY5IDQ0Ljc5NjlaTTM1LjE5NTMgMzguMzk4NEw0MS41OTM3IDM4LjM5ODRMNDEuNTkzNyA0NC43OTY5TDM1LjE5NTMgNDQuNzk2OUwzNS4xOTUzIDM4LjM5ODRaTTM1LjE5NTMgNTEuMTk1M0w0MS41OTM3IDUxLjE5NTNMNDEuNTkzNyA1Ny41OTM3TDM1LjE5NTMgNTcuNTkzN0wzNS4xOTUzIDUxLjE5NTNaTTQxLjU5MzggMzJMNDggMzJMNDggMzguMzk4NEw0MS41OTM3IDM4LjM5ODRMNDEuNTkzOCAzMlpNNDEuNTkzNyA1Ny41OTM3TDQ4IDU3LjU5MzhMNDggNjRMNDEuNTkzNyA2NEw0MS41OTM3IDU3LjU5MzdaIiBmaWxsPSIjMjlCNkY2Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==&label=graphx&style=for-the-badge&color=blue)](https://pub.dev/packages/graphx)
[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg?style=for-the-badge&color=blue)](https://pub.dev/packages/effective_dart)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge&color=blue)](https://opensource.org/licenses/MIT)

| rendering | prototype | design |

Making drawings and animations in Flutter, super simple and *FUN*.

- Check our [web 🎨 gallery !](https://graphx-gallery.surge.sh/#/)

- Play with the examples directly [on Zapp!](https://zapp.run/pub/graphx?entry=lib/main.dart&file=lib/main.dart)

---

### video showcase.

Used at [Flutter Forward Extended London](https://gdg.community.dev/events/details/google-gdg-london-presents-flutter-forward-extended-london/) (Jan 2023)

- GraphX compilation

[![GraphX Intro](https://img.youtube.com/vi/51LJvwWP16A/1.jpg)](https://www.youtube.com/watch?v=51LJvwWP16A "GraphX Intro")

- Fly Dash! demo

[![Fly Dash!](https://img.youtube.com/vi/T_SkP68BXSY/1.jpg)](https://www.youtube.com/watch?v=T_SkP68BXSY "Fly Dash! demo")

### news.

Check our [CHANGELOG](https://github.com/roipeker/graphx/blob/master/CHANGELOG.md).

### wiki-tips.

To get some extended, boring explanations, and eventually some sample codes, check
the [GraphX™ Wiki]()

### prototyping.

GraphX is all about visuals, here you have some screen captures of random prototypes I've been
doing, while developing and testing graphx.

For your GraphX scene to support **Hot Reload**, you should initialize your variables and
DisplayObjects inside `addedToStage`, and optionally clean them in `dispose`.

[![artificial horizon](https://media.giphy.com/media/NMG8gfpJxFiu1eALZo/giphy.gif)](https://media.giphy.com/media/NMG8gfpJxFiu1eALZo/source.mp4)
[![parallax game](https://media.giphy.com/media/RIrvhfZoDtal41Tb4e/giphy-downsized.gif)](https://media.giphy.com/media/RIrvhfZoDtal41Tb4e/source.mp4)
[![charts pie color 2](https://media.giphy.com/media/pQdeurUOAqWdZuxxUK/giphy.gif)](https://media.giphy.com/media/pQdeurUOAqWdZuxxUK/source.mp4)
[![simple particles](https://media.giphy.com/media/VYSJF6uUO323FV0Nhh/giphy.gif)](https://media.giphy.com/media/WodwBEccmRjmhq2dAp/source.mp4)
[![drawing api playful v1](https://media.giphy.com/media/HdJmgzVYLK8jUxX437/giphy.gif)](https://media.giphy.com/media/HdJmgzVYLK8jUxX437/source.mp4)

... jump to [other gifs samples](#screencast-demos) ...

## Background.

GraphX™ is here to help you build custom drawings in your Flutter apps. Providing a great
versatility to power those screen pixels to a different level.

It's inspired by the good-old Flash API, which forged my way into programming back in the days, and
inspired many other rendering frameworks, in several languages through the years.

I was thinking how much I missed to "play" with code, to make things more organic, artistic,
alive... I totally love Flutter, but I always feel that it requires too much boilerplate to make
things move around (compared to what I used to code).

Even if GraphX™ is not an animation library (although has a small tween engine), nor a game engine,
It can help you build really awesome user experiences! It just runs on top of `CustomPainter`...
Using what Flutter SDK exposes from the SKIA engine through the Canvas, yet, gives you some "
framework" to run `isolated` from the Widget's world.

Can be used to simple draw a line, a circle, maybe a custom button, some splash effect on your UI,
or even a full-blown game in a portion of the screen.

Mix and match with Flutter as you please, as **GraphX**™ uses `CustomPainter`, it is part of your
Widget's tree.

## Concept.

The repo is in early stages. You can check the [changelog](https://github.com/roipeker/graphx/blob/master/CHANGELOG.md) to get the latest updates.

GraphX has support for loading `rootBundle` assets:

```dart
ResourceLoader.loadBinary(assetId)
ResourceLoader.loadGif(assetId)
ResourceLoader.loadTextureAtlas(imagePath, xmlPath)
ResourceLoader.loadTexture(assetId)
ResourceLoader.loadImage(assetId)
ResourceLoader.loadString(assetId)
ResourceLoader.loadJson(assetId)
ResourceLoader.loadSvg(assetId)
```

As well as network images (SVG is not supported on non-SKIA targets):

```dart
ResourceLoader.loadNetworkTexture(url);
ResourceLoader.loadNetworkSvg(url);
```

ResourceLoader also stores in cache based on the `assetId` or `url` provided. You can pass `cacheId`
in most methods
to override that, once the resources loaded, you can access them with:

```dart
ResourceLoader.getTexture(id);
ResourceLoader.getSvg(id);
ResourceLoader.getAtlas(id);
ResourceLoader.getGif(id);
```

GraphX™ also provides "raw" support for Text rendering, using the `StaticText` class.

---

How does it work?

GraphX™ drives a `CustomPainter` inside. The idea is to simplify the usage of Flutter's `Canvas`,
plus adding the **display list** concept, very similar to the Widget Tree concept; so you can
imperatively code, manage and create more complex "Scenes".

The library has its own rendering cycle using Flutter's `Ticker` (pretty much
like `AnimationController` does), and each `SceneWidgetBuilder` does its own input capture and
processing (mouse, keyboard, touches). Even if it runs on the Widget tree, you can enable the flags
to capture mouse/touch input, or keystrokes events (if u wanna do some simple game, or desktop/web
tool).

### Sample code.

```dart
body: Center(
child: SceneBuilderWidget( /// wrap any Widget with SceneBuilderWidget
builder: () => SceneController(
back: GameSceneBack(), /// optional provide the background layer
front: GameSceneFront(), /// optional provide the foreground layer
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You have pushed the button this many times:'),
Text('$_counter',style: Theme.of(context).textTheme.headline4),
],
),
),
),
```

GraphX™ is based on "Scenes", each `SceneBuilderWidget` requires a `SceneController`.
This controller is the initializer of the Scenes layers, which can be:

- `back` (background painter),
- `front` (foreground painter),
- or both.

Also takes a `SceneConfig()`, so you can configure what you need from the Widget's side.
You can make use of some predefined Scene configurators:

- `SceneConfig.static`: If you plan to only use this scene to draw some graphics, like a background.
- `SceneConfig.games`: Activates all GraphX features, auto render and update, pointers and keyboard
support.
- `SceneConfig.tools`: Shortcut of _games_, helpful if you wanna use it in some custom drawing
editor, or similar with keyboard shortcuts.
- `SceneConfig.interactive` (_default_): Probably the most common setup for mobile, enables all
features except keyboard support.
- `SceneConfig.autoRender`: Allows you to have a ticker running, and auto update the scene, with NO
inputs (mouse/touch/keyboard), if you wanna have an animated Widget, or maybe if you wanna control
it externally.

Each "Scene" has to extend `Sprite`, this root class represents the starting point of that
particular scene hierarchy. Think of it as `MaterialApp` widget is to all other children Widgets in
the tree.

Here we get into **GraphX™** world, no more Widgets trees or immutable properties.

You can make custom UI widgets, games, or make use of GraphX to create a static drawing, like curved
backgrounds, or complex shapes.

Is a good practice to override `addedToStage()` as your entry point, here the Scene is ready,
the `root` class has been added to the _glorified stage_, so you can access the Canvas size
through `stage.stageWidth` and `stage.stageHeight`, the keyboard manager (if available), and lots of
other properties, up to the `SceneController` that owns the scene (`stage.scene.core`, although,
that's irrelevant for now):

```dart
class GameScene extends Sprite {

@override
void addedToStage() {
/// Here you can access the `stage`, get the size of the
/// current Scene, keyboard events, or any stage property
/// You can initialize your DisplayObjects here to play
/// "safe" if you need to access any stage property.
}
```

For now, GraphX™ has a few classes for rendering in the "display list":
Like `Shape` (for "pen" drawings commands through it's `graphics` property), `Sprite` (create
hierarchies of rendering objects), `StaticText` (for Texts), `GxIcon` (for Flutter icons)
, `Bitmap` (for `GTexture`, which is a wrapper around `dart:ui.Image`), `MovieClip`(for Spritesheet
and Gif support), `SvgShape` (dependency for `svg`, package not included), `SimpleParticleSystem` (
to create optimized particles for games), and Flare/Rive render objects which will live in another
package/utility eventually to avoid dependencies.

By the way, in the previous example, `GameScene` is the `root` node in the _display tree_, the entry
point where DisplayObjects renders, and where you need to add your own objects.

For instance, to create a simple purple circle:

```dart
@override
void addedToStage() {
var circle = Shape();
circle.graphics.lineStyle(2, Colors.purple.value)

/// access HEX value of Color
..drawCircle(0, 0, 20)
..endFill();
addChild(circle); // add the child to the rootScene.
}
```

`Sprite` internally extends from the abstract class `DisplayObjectContainer`, and as the name
implies, is a container that can contain more `DisplayObject`s. Yet, `Shape` is a `DisplayObject` (
another abstract class, and also, the root class of all rendering objects in **GraphX**), so it
can't contain children. That makes it a bit more performant on each painter step.
So, when you need to group objects, you should create `Sprite`s and add children into it, even
other `Sprite`s, that's the idea of **GraphX** after all, group rendering objects so you can
transform them independently or transform a parent `Sprite` (or subclass of it), and apply it to the
tree inside of it, transformations are accumulative from parent to child ...

#### What is a transformation?

The ability to translate, scale, rotate, skew a `DisplayObject` through his properties: x, y, width,
height, scaleX, scaleY, rotation, skewX, skewY, etc.

We could also use our root scene to draw things:

```dart
@override
addedToStage() {
graphics.beginFill(0x0000ff, .6)
..drawRoundRect(100, 100, 40, 40, 4)
..endFill();
...
}
```

#### Pointer access

Pointer signals has been "simplified" as Mouse events now... as it's super easy to work with single
touch / mouse interactions in `DisplayObject`s.
There are a bunch of signals to listen on each object... taken from AS3, and JS.

- onMouseDoubleClick
- onMouseClick
- onMouseDown
- onMouseUp
- onMouseMove
- onMouseOver
- onMouseOut
- onMouseScroll

They all emit a `MouseInputData` with all the needed info inside, like stage coordinates, or
translated local coordinates, which "mouse" button is pressed, etc.

---

### Demos.

_Some demos are only using **GraphX™** partially_

- [snake game ⇢](https://graphx-snake-game.surge.sh/)
- [breakout game ⇢](https://graphx-breakout-v4.surge.sh/)

- [3d card with shadow ⇢](https://graphx-dropshadow-card.surge.sh/)
- [rating ⇢](https://graphx-star-rating.surge.sh/) ([dribbble design](https://dribbble.com/shots/12287144-Rating))

- [drawpad ⇢](https://graphx-drawpad3.surge.sh/)
// [creepy version ⇢](https://graphx-drawpad2.surge.sh/)

- [node garden ⇢](https://graphx-node-garden.surge.sh/)

- [fb reactions ⇢](https://graphx-fb-reactions.surge.sh/)

- [puzzle pieces ⇢](https://roi-puzzle-v2.surge.sh/)

- [lines repulsion ⇢](https://roi-graphx-mouse-repulsion.surge.sh/)
- [liquify dog ⇢](https://roi-graphx-liquify-dog.surge.sh/)
- [image transform triangles ⇢](https://roi-graphx-image-transform-triangles.surge.sh/)
- [jelly green ⇢](https://roi-graphx-jelly-green.surge.sh/) ([source](https://gist.github.com/roipeker/dbf792b862ad8dfb526c227c2e1d4ad9))

- [drawing-ball collision ⇢](https://roi-graphx-balls-collision.surge.sh/) ([source](https://gist.github.com/roipeker/d0fbbb1fa5409594f18c8e280ac39d93))

- [spiral 3d ⇢](https://roi-graphx-spiral3d.surge.sh/) ([source](https://gist.github.com/roipeker/f5987e7158a3a7e932e2547e3d919951))

- [splashscreen ⇢](https://roi-graphx-splash.surge.sh/) ([source](https://gist.github.com/roipeker/37374272d15539aa60c2bdc39001a035))

- [color spectrum ⇢](https://roi-graphx-color-picker.surge.sh/) (based
on [SuperDeclarative! workshop](https://www.youtube.com/watch?v=HURA4DKjA1c))

- [ui line button ⇢](https://roi-graphx-linebutton.surge.sh/)

- [flutter widget mix ⇢](https://roi-graphx-widgetmix.surge.sh)

- [space shooter ⇢](https://roi-graphx-spaceshooter.surge.sh)

> controls > move: ARROWS, thrust: SHIFT, shoot: SPACEBAR, shield: U

- [artificial horizon ⇢](https://roi-graphx-artificial-horizon.surge.sh/)

> controls > change altitude and rotation: ARROWS

- [split RGB ⇢](https://roi-graphx-rgbsplit.surge.sh)

- [input text particles ⇢](https://roi-graphx-particles-input.surge.sh)

- [fishEye particles ⇢](https://roi-graphx-fisheyeparticles.surge.sh/)

- [fishEye particles (basic) ⇢](https://roi-graphx-fisheyetext.surge.sh)

- [particles emitter ⇢](https://roi-graphx-particles2.surge.sh)

- [shapeMaker clone ⇢](https://roi-graphx-shapemaker.surge.sh)

- [mouse follower ⇢](https://roi-graphx-dotchain.surge.sh)

- [basic hit test ⇢](https://roi-graphx-hittest.surge.sh)

- [spriteSheet rendering ⇢](https://roi-graphx-spritesheet.surge.sh)

- [displayObject pivot ⇢](https://roi-graphx-textpivot.surge.sh)

- [simple solo-ping-pong game ⇢](https://roi-graphx-pingpong.surge.sh/)

- [first experiment with graphx ⇢](https://roi-graphx-cells.surge.sh/)

---

Feel free to play around with the current API, even if it's still rough on edges and unoptimized, it
might help you do things quicker.

SKIA is pretty powerful!

---

### help & socialize.

| **
Discord** | **
Telegram** |
| :----------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [![Discord Shield](https://img.shields.io/discord/777232130991718440.svg?style=for-the-badge&logo=discord)](https://discord.gg/5aTX6HzS5Q) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg?style=for-the-badge&logo=telegram)](https://t.me/joinchat/Mbc7jBxxAm4K1uhaVPIR-Q) |

---

### Screencast Demos.

(Some demos uses GraphX's only for ticker, input events or initial scene graph, making usage of
direct `Canvas` calls).\_

- charts bezier + gradient

[![charts bezier + gradient](https://media.giphy.com/media/QWHufIK9GyEAIM4Dcn/giphy.gif)](https://media.giphy.com/media/QWHufIK9GyEAIM4Dcn/source.mp4)

- neumorphic button

[![neumorphic button](https://media.giphy.com/media/tX24wynwPRVm6cymjy/giphy.gif)](https://media.giphy.com/media/tX24wynwPRVm6cymjy/source.mov)

- 3d card shadow

[![3d card shadow](https://media.giphy.com/media/18XFI8lY9Uj6cgoF66/giphy-downsized.gif)](https://media.giphy.com/media/18XFI8lY9Uj6cgoF66/source.mp4)

- 3d pizza box

[![3d pizza box](https://media.giphy.com/media/8OUnKDJ2ujT9pBpylj/giphy.gif)](https://media.giphy.com/media/8OUnKDJ2ujT9pBpylj/source.mp4)

- pendulum

[![pendulum](https://media.giphy.com/media/6D946gz1PkF0zZV697/giphy.gif)](https://media.giphy.com/media/6D946gz1PkF0zZV697/source.mp4)

- rating stars

[![rating stars](https://media.giphy.com/media/2ZK44FneclymOpyEXR/giphy.gif)](https://media.giphy.com/media/2ZK44FneclymOpyEXR/source.mov)

- rotating dial

[![rotating dial](https://media.giphy.com/media/xC8rB3jR9nXDJDMwQM/giphy.gif)](https://media.giphy.com/media/xC8rB3jR9nXDJDMwQM/source.mp4)

- intro "universo flutter"

[![intro "universo flutter"](https://media.giphy.com/media/ZyVw45nnrQ49Ig3NCb/giphy.gif)](https://media.giphy.com/media/ZyVw45nnrQ49Ig3NCb/source.mp4)

- 3d spiral loader

[![3d spiral loader](https://media.giphy.com/media/eT1pePI6NqpEg3rBmA/giphy.gif)](https://media.giphy.com/media/eT1pePI6NqpEg3rBmA/source.mov)

- breakout game

[![breakout game](https://media.giphy.com/media/roLsn44mOUpbOhV0Da/giphy.gif)](https://media.giphy.com/media/roLsn44mOUpbOhV0Da/source.mov)

- gauges

[![gauges](https://media.giphy.com/media/rWF1Sc4CGLf3zfYlXn/giphy-downsized.gif)](https://media.giphy.com/media/rWF1Sc4CGLf3zfYlXn/source.mp4)

- bubble loader

[![bubble loader](https://media.giphy.com/media/pKXa68pcv2H1dSjxYX/giphy.gif)](https://media.giphy.com/media/pKXa68pcv2H1dSjxYX/source.mp4)

- xmas counter

[![xmas counter](https://media.giphy.com/media/yTNXKR5BHbQKOKpfrS/giphy-downsized.gif)](https://media.giphy.com/media/yTNXKR5BHbQKOKpfrS/source.mp4)

- google fonts

[![google fonts](https://media.giphy.com/media/oUoYS87SzOldcI5itX/giphy.gif)](https://media.giphy.com/media/oUoYS87SzOldcI5itX/source.mp4)

- graphics.drawTriangles

[![graphics.drawTriangles](https://media.giphy.com/media/Dh7i3D5z1kbWpc4bn3/giphy-downsized.gif)](https://media.giphy.com/media/Dh7i3D5z1kbWpc4bn3/source.mp4)

- image transform

[![image transform](https://media.giphy.com/media/s9BcsLdSGMU0ARvOQX/giphy.gif)](https://media.giphy.com/media/s9BcsLdSGMU0ARvOQX/source.mp4)

- svg sample demo

[![svg sample demo](https://media.giphy.com/media/OtGpmd1fAVzw3pK7kD/giphy.gif)](https://media.giphy.com/media/wLuFm9xlXXmkllWJQt/source.mp4)

- chart lines

[![charts lines](https://media.giphy.com/media/uVFvFOTUICAsYqb13r/giphy.gif)](https://media.giphy.com/media/uVFvFOTUICAsYqb13r/source.mp4)

- charts pie

[![charts pie color 1](https://media.giphy.com/media/z1aIQzYSSGVKeWbabJ/giphy.gif)](https://media.giphy.com/media/z1aIQzYSSGVKeWbabJ/source.mp4)

- mouse cursor support

[![mouse cursor support](https://media.giphy.com/media/MjXTKJpen8vIN34rfW/giphy.gif)](https://media.giphy.com/media/MjXTKJpen8vIN34rfW/source.mp4)

- debug objects bounds

[![debug objects bounds](https://media.giphy.com/media/F7Wnsw3kUjk0L4CDfu/giphy.gif)](https://media.giphy.com/media/F7Wnsw3kUjk0L4CDfu/source.mp4)

- demo sample tween

[![demo sample tween](https://media.giphy.com/media/EY4RhVoqHTKVBJUNzW/giphy.gif)](https://media.giphy.com/media/EY4RhVoqHTKVBJUNzW/source.mp4)

- direction blur filter

[![directional blur filter](https://media.giphy.com/media/a4Rzda8uvFxCPvfI22/giphy.gif)](https://media.giphy.com/media/a4Rzda8uvFxCPvfI22/source.mp4)

- hand drawing v1

[![hand drawing v1](https://media.giphy.com/media/uliHRVWVW5IlliliIi/giphy-downsized.gif)](https://media.giphy.com/media/uliHRVWVW5IlliliIi/source.mp4)

- hand drawing v2

[![hand drawing v2](https://media.giphy.com/media/f6UJj36HqFYJuejz5M/giphy.gif)](https://media.giphy.com/media/f6UJj36HqFYJuejz5M/source.mp4)

- drawing api playful v2

[![drawing api playful v2](https://media.giphy.com/media/Ld3XIYErKsoyCQtzcg/giphy.gif)](https://media.giphy.com/media/Ld3XIYErKsoyCQtzcg/source.mp4)

- elastic band

[![elastic band](https://media.giphy.com/media/KiSrFNYQ7kED1HzSlJ/giphy.gif)](https://media.giphy.com/media/KiSrFNYQ7kED1HzSlJ/source.mp4)

- flare playback

[![Flare playback](https://media.giphy.com/media/t0ZcOUPdCtg8aPtL2B/giphy-downsized.gif)](https://media.giphy.com/media/t0ZcOUPdCtg8aPtL2B/source.mp4)

- flip child scenes

[![Flip child scenes](https://media.giphy.com/media/siMNzfRWTaKK9Pw0n2/giphy.gif)](https://media.giphy.com/media/siMNzfRWTaKK9Pw0n2/source.mp4)

- flutter widgets mix

[![Mix with Flutter widgets](https://media.giphy.com/media/YfzNLmfE1hutWI176e/giphy-downsized.gif)](https://media.giphy.com/media/YfzNLmfE1hutWI176e/source.mp4)

- icon with gradient paint

[![icon painter gradient](https://media.giphy.com/media/gC94IOdu6v1GoWJZWY/giphy.gif)](https://media.giphy.com/media/gC94IOdu6v1GoWJZWY/source.mp4)

- inverted masks

[![inverted masks](https://media.giphy.com/media/1tsbaO28YXXxc1lvsd/giphy-downsized.gif)](https://media.giphy.com/media/1tsbaO28YXXxc1lvsd/source.mp4)

- isometric demo

[![isometric demo](https://media.giphy.com/media/EInY3MKZ2xvmYNl3fm/giphy.gif)](https://media.giphy.com/media/EInY3MKZ2xvmYNl3fm/source.mp4)

- light button

[![light button](https://media.giphy.com/media/4Sspuw3R8Rdr2tsE4T/giphy.gif)](https://media.giphy.com/media/4Sspuw3R8Rdr2tsE4T/source.mp4)

- marquesina

[![marquesina de texto](https://media.giphy.com/media/Q2cIsU34CbzZHfNA2z/giphy.gif)](https://media.giphy.com/media/Q2cIsU34CbzZHfNA2z/source.mp4)

- menu with mask

[![menu mask](https://media.giphy.com/media/xaEN62vmEQxTR1zFpy/giphy.gif)](https://media.giphy.com/media/xaEN62vmEQxTR1zFpy/source.mp4)

- menu mouse test

[![menu mouse](https://media.giphy.com/media/d9cQT0mOwgbRJ2fbyd/giphy.gif)](https://media.giphy.com/media/d9cQT0mOwgbRJ2fbyd/source.mp4)

- nested transformations

[![nested transform touch](https://media.giphy.com/media/HLdqEQze3LUDlDCTBo/giphy.gif)](https://media.giphy.com/media/HLdqEQze3LUDlDCTBo/source.mp4)

- particles with alpha

[![particles with alpha](https://media.giphy.com/media/Z9D7bpWqjX8KJMTMMc/giphy-downsized.gif)](https://media.giphy.com/media/Z9D7bpWqjX8KJMTMMc/source.mp4)

- particles blending

[![particles blend](https://media.giphy.com/media/roD1B1diHxT9A61msb/giphy-downsized-large.gif)](https://media.giphy.com/media/roD1B1diHxT9A61msb/source.mp4)

- circular progress panel

[![progress panel](https://media.giphy.com/media/uygZcQPIe7Dp4RHHrB/giphy.gif)](https://media.giphy.com/media/uygZcQPIe7Dp4RHHrB/source.mp4)

- rive playback

[![rive playback](https://media.giphy.com/media/lVBkZ6o1qBqnek92Qj/giphy-downsized.gif)](https://media.giphy.com/media/lVBkZ6o1qBqnek92Qj/source.mp4)

- 3d rotation

[![rotation 3d](https://media.giphy.com/media/7T3hqnHc7cRrqEjE4a/giphy.gif)](https://media.giphy.com/media/7T3hqnHc7cRrqEjE4a/source.mp4)

- spiral

[![spiral](https://media.giphy.com/media/z9FFwt6sPQSqrVuMyF/giphy-downsized.gif)](https://media.giphy.com/media/z9FFwt6sPQSqrVuMyF/source.mp4)

- spritesheet explosion

[![spritesheet explosion](https://media.giphy.com/media/Ldj7i8XiPZpYZ92WNN/giphy.gif)](https://media.giphy.com/media/Ldj7i8XiPZpYZ92WNN/source.mp4)

- supernova tween

[![star effect](https://media.giphy.com/media/LFAhCww7vVItef78v9/giphy.gif)](https://media.giphy.com/media/LFAhCww7vVItef78v9/source.mp4)

- text rainbow

[![text rainbow](https://media.giphy.com/media/wk8s7jJnwfdBQfbdvb/giphy.gif)](https://media.giphy.com/media/wk8s7jJnwfdBQfbdvb/source.mp4)

- basic tween animation

[![tween animation](https://media.giphy.com/media/XNO5QpJCyctdLZYMCS/giphy.gif)](https://media.giphy.com/media/XNO5QpJCyctdLZYMCS/source.mp4)

- tween behaviour

[![tween behaviour](https://media.giphy.com/media/DWbutR01h9LpschVDA/giphy.gif)](https://media.giphy.com/media/DWbutR01h9LpschVDA/source.mp4)

- tween color

[![tween color](https://media.giphy.com/media/1tjXlWG1ImPhI3eij4/giphy.gif)](https://media.giphy.com/media/1tjXlWG1ImPhI3eij4/source.mp4)

- multiple scenes

[![multiple scenes](https://media.giphy.com/media/mUoYPvPQIqZZ0rEVVe/giphy-downsized.gif)](https://media.giphy.com/media/mUoYPvPQIqZZ0rEVVe/source.mp4)

- [line button ⇢](https://roi-graphx-linebutton.surge.sh/)

[![line button](https://media.giphy.com/media/Uq4pPWGa2Qo5WwlRqA/giphy.gif)](https://media.giphy.com/media/Uq4pPWGa2Qo5WwlRqA/source.mp4)

- [color picker ⇢](https://roi-graphx-color-picker.surge.sh/)

[![color picker](https://media.giphy.com/media/r8BGvFFPdHU59dJbbB/giphy.gif)](https://media.giphy.com/media/r8BGvFFPdHU59dJbbB/source.mp4)

- responsive switch

[![responsive switch](https://media.giphy.com/media/vO4DwTNeIXUS7beQFA/giphy.gif)](https://media.giphy.com/media/vO4DwTNeIXUS7beQFA/source.mp4)

---

#### Donation

You can [buymeacoffee](https://www.buymeacoffee.com/roipeker) or support **GraphX™**
via [Paypal](https://www.paypal.me/roipeker/)

[![Donate via PayPal](https://cdn.rawgit.com/twolfson/paypal-github-button/1.0.0/dist/button.svg)](https://www.paypal.me/roipeker/)

## [![Support via buymeacoffee](https://cdn.buymeacoffee.com/buttons/v2/default-white.png)](https://www.buymeacoffee.com/roipeker)