Rive é uma ferramenta para criar e reproduzir animações vetoriais interativas que combina um editor de animação e bibliotecas runtime para plataformas móveis. Ao contrário de formatos passivos, o Rive suporta State Machine — lógica de transições entre animações com base nas ações do usuário. De acordo com o Rive Blog (2026), a ferramenta é usada em mais de 10.000 projetos, incluindo Duolingo e Bumble. Saiba mais sobre outros tipos de animação no guia geral de animação.
Principais pontos
Rive (anteriormente Rive.app, fundada em 2016) é um editor gráfico e runtime multiplataforma para animação vetorial interativa. Ao contrário do After Effects + Bodymovin (Lottie), o Rive fornece um ambiente unificado: o designer desenha, anima e configura a lógica de transição diretamente no editor. O resultado é exportado para um arquivo binário .riv que pesa de 2 a 50 KB dependendo da complexidade.
A principal diferença do Rive em relação a outras soluções é a State Machine. É um grafo visual onde os nós são animações (Idle, Hover, Press, Active), e as transições entre eles são ativadas por gatilhos (Touch, Drag, Boolean). O desenvolvedor simplesmente envia gatilhos no código, e o RiveRuntime decide qual animação reproduzir e como alternar suavemente entre elas. De acordo com a Rive Engineering (2026), a animação .riv média com State Machine ocupa 15 KB — 5 a 10 vezes menos que um arquivo de vídeo equivalente.
Rive Runtime está disponível para Flutter, iOS (Swift), Android (Kotlin/Java), Web (WASM) e React. A renderização é feita via Skia (Flutter/Web), Core Graphics (iOS) ou Canvas (Android). O Rive suporta animação de formas (Knob, Slider, Button com geometria personalizada), permitindo criar componentes de UI totalmente animados, não apenas animações decorativas.
Rive e Lottie resolvem tarefas diferentes. Lottie é um player para animação pronta do After Effects, ideal para efeitos decorativos passivos. Rive é uma ferramenta para criar animações interativas com lógica própria, onde a animação responde às ações do usuário. A escolha depende do nível de interatividade necessário.
| Critério | Rive | Lottie |
|---|---|---|
| Editor | Próprio (Rive Editor) | Adobe After Effects + Bodymovin |
| Interatividade | State Machine, gatilhos, Boolean, Number | Apenas play/pause/seek |
| Formato | .riv (binário) | .json ou .lottie (protobuf) |
| Renderização | Skia / Core Graphics / Canvas | Canvas / Core Animation / Skia |
| UI animada | Knob, Slider, Button, Input (incorporados) | Nenhum (apenas camadas decorativas) |
Quando escolher Rive: botões interativos com resposta ao pressionar, elementos de jogo (personagens com estados), interruptores animados, ícones dinâmicos que reagem ao status. Quando escolher Lottie: preloaders, curtidas, telas de boas-vindas, animações de acento sem lógica. Para projetos Flutter, o Rive é a escolha preferida devido à integração nativa com Skia e o pipeline de renderização do Flutter.
No Flutter, RiveAnimation é o widget principal para incorporar arquivos .riv. Está disponível através do pacote rive (oficial). RiveAnimation suporta argumentos: artboard (seleção de prancheta), animation (nome da animação), fit, alignment, controllers (para State Machine). Para cenas interativas, é usado StateMachineController.
import 'package:rive/rive.dart';
// Reprodução simples de animação
RiveAnimation.asset(
'assets/animations/button.riv',
artboard: 'Button',
animations: const ['idle'],
fit: BoxFit.contain,
)
// StateMachineController com gatilhos
class InteractiveButton extends StatefulWidget {
@override
State<InteractiveButton> createState() => _InteractiveButtonState();
}
class _InteractiveButtonState extends State<InteractiveButton> {
StateMachineController? _controller;
SMIInput<bool>? _isPressed;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTapDown: (_) => _isPressed?.value = true,
onTapUp: (_) => _isPressed?.value = false,
child: RiveAnimation.asset(
'assets/animations/button.riv',
fit: BoxFit.contain,
onInit: (artboard) {
_controller = StateMachineController.fromArtboard(
artboard, 'State Machine 1',
);
if (_controller != null) {
artboard.addController(_controller!);
_isPressed = _controller!.findInput<bool>('isPressed');
}
},
),
);
}
}
Melhores práticas no Flutter: carregue arquivos .riv de forma assíncrona via RiveAnimation.asset (AssetBundle incorporado). Para listas (ListView), use um único StateMachineController reutilizado entre itens. O Rive não requer mais importações separadas — rive v0.12+ inclui todos os recursos. Para animação personalizada, controle o RiveAnimationController diretamente — ele fornece acesso a animações, mesclagem (blend) e velocidade.
No iOS, RiveRuntime é representado pela classe RiveView (UIKit) e RiveViewModel (SwiftUI). A biblioteca é conectada via Swift Package Manager. RiveView renderiza arquivos .riv via Core Graphics e Metal, suportando 120 FPS em telas ProMotion. Para State Machine, é usado RiveStateMachineLayer com vinculação de gatilhos.
import RiveRuntime
// SwiftUI: RiveViewModel com animação
struct RiveAnimationView: View {
@State private var isPressed = false
var body: some View {
RiveViewModel(fileName: "button").view()
.frame(width: 200, height: 60)
.gesture(
DragGesture(minimumDistance: 0)
.onChanged { _ in
if !isPressed {
isPressed = true
// Gatilho via State Machine
}
}
.onEnded { _ in
isPressed = false
}
)
}
}
// UIKit: RiveView com controle manual
let riveView = RiveView()
riveView.configure(fileName: "loading", extension: "riv")
riveView.fit = .contain
riveView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(riveView)
// Gerenciamento de State Machine
riveView.triggerInput(named: "startAnimation")
Melhores práticas no iOS: use RiveViewModel para SwiftUI — ele gerencia automaticamente o ciclo de vida. Para UIKit, inscreva-se no RiveViewDelegate para rastreamento de eventos. O Rive consome menos CPU que o Lottie no iOS graças à renderização via Core Graphics. Para animações em NavigationView/UICollectionView, use pré-carregamento via RiveFile.preload().
No Android, RiveAnimationView é a View principal para incorporar animações .riv. A biblioteca app.rive:rive-android é conectada via Gradle. RiveAnimationView herda de View e renderiza via Canvas com suporte a aceleração de hardware. State Machine é gerenciada através de setTriggers e setInputs.
// build.gradle.kts
implementation("app.rive:rive-android:0.9.0")
// XML layout
<app.rive.RiveAnimationView
android:id="@+id/riveView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:rive_file="@raw/mascot"
app:rive_artboard="Mascot"
app:rive_animation="idle" />
// Kotlin: gerenciamento de State Machine
import app.rive.riveandroid.RiveAnimationView
import app.rive.riveandroid.StateMachineInput
val riveView = findViewById<RiveAnimationView>(R.id.riveView)
riveView.post {
riveView.setTriggers("hover") "> Envio de trigger para a State Machine
riveView.setInput("speed", 1.5f)
riveView.setInput("isActive", true)
riveView.play()
}
// Manipulação de conclusão de animação
riveView.addListener(object : RiveAnimationView.RiveListener() {
override fun onAnimationCompleted(animationName: String) {
Log.d("Rive", "Animation $animationName completed")
}
})
Melhores práticas no Android: carregue arquivos .riv via res/raw (recursos incorporados) ou assets (carregamento por rede). RiveAnimationView gerencia automaticamente o ciclo de vida — não chame play/pause manualmente em onResume/onPause. Para animações em RecyclerView, use setOnScrollListener para pausar a reprodução durante a rolagem. De acordo com a documentação do Rive (2026), arquivos .riv de até 100 KB são analisados em 5–10 ms em dispositivos de médio porte.
State Machine é um recurso chave do Rive que o diferencia dos formatos de animação passiva. É um grafo visual onde os vértices são estados (animações) e as arestas são transições ativadas por gatilhos. A State Machine é criada no Rive Editor: o designer adiciona nós de animação, conecta-os com linhas e atribui gatilhos (Touch, Boolean, Number). O desenvolvedor só precisa enviar esses gatilhos do código.
// Flutter: controle total sobre State Machine
import 'package:rive/rive.dart';
class RiveStateMachineWidget extends StatefulWidget {
@override
State<RiveStateMachineWidget> createState() => _RiveStateMachineWidgetState();
}
class _RiveStateMachineWidgetState extends State<RiveStateMachineWidget> {
Artboard? _artboard;
StateMachineController? _controller;
SMIInput<bool>? _isHovered;
SMIInput<double>? _progress;
@override
Widget build(BuildContext context) {
return MouseRegion(
onEnter: (_) => _isHovered?.value = true,
onExit: (_) => _isHovered?.value = false,
child: RiveAnimation.asset(
'assets/interactive_icon.riv',
onInit: (artboard) {
_controller = StateMachineController.fromArtboard(
artboard, 'State Machine 1',
);
artboard.addController(_controller!);
_isHovered = _controller!.findInput<bool>('isHovered');
_progress = _controller!.findInput<double>('progress');
},
),
);
}
}
// Envio de valor numérico
SMIInput<double> speedInput = controller.findInput('speed');
speedInput?.value = scrollPosition;
Tipos de gatilhos: Boolean — interruptor (true/false), Number — valor numérico (0.0–1.0 ou intervalo arbitrário), Trigger — impulso único (pressionar botão). No Rive Editor, pode-se configurar a suavização de transição (Transition Duration) — valor recomendado 100–300 ms para suavidade. Para estados de UI complexos, use State Machines aninhadas (Nested State Machines) — cada parte da animação é gerenciada independentemente. A State Machine do Rive funciona em todas as plataformas sem alterações no arquivo .riv — a lógica de transição está embutida no arquivo, não no código do aplicativo.
Perguntas frequentes
Rive é animação interativa com State Machine, gatilhos e seu próprio editor. Lottie é reprodução passiva de animação JSON do After Effects. Rive é adequado para botões, jogos e elementos de UI com reação do usuário. Lottie é para efeitos decorativos (preloaders, curtidas). Rive usa o formato .riv, Lottie usa JSON ou .lottie.
Sim. O Rive suporta reprodução simples de animação sem State Machine — especifique animationName no RiveAnimation.asset ou RiveView. Neste caso, o Rive funciona como Lottie: animação em loop ou única. A State Machine é uma camada opcional para interatividade. Para projetos que precisam apenas de animação decorativa, a State Machine é desnecessária.
Sim, via AndroidView para incorporar RiveAnimationView no Compose. A partir do rive-android 0.9.0, um wrapper Compose RiveAnimation compose() com suporte a modificadores está disponível. Para gerenciamento de State Machine, use remember { StateMachineHolder() }. O Rive também suporta Compose Multiplatform no iOS através do Compose Runtime compartilhado.
Sim, o Rive suporta Flutter Web via Skia Wasm (CanvasKit) ou renderizador HTML. O CanvasKit é recomendado para máximo desempenho. Os arquivos Rive são carregados via solicitação HTTP (RiveAnimation.network) ou empacotados como assets. Flutter Web com Rive funciona corretamente em todos os navegadores modernos (Chrome 90+, Safari 15+, Firefox 90+).
Limite o número de camadas ativas simultâneas a 20–30. Use Flat shading em vez de Gradient para formas simples. Para animações com texto, use System Text (não texto vetorial no Rive Editor). Minimize o número de animações Bone para personagens — elas são desnecessárias para elementos de UI. Em dispositivos antigos, desative o double buffering: riveView.enableDoubleBuffering = false no Android.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também