Loading Assets
Loading and replacing assets dynamically at runtime
Some Rive files may contain assets that can be embedded within the actual file binary, such as font, image, or audio files. The Rive runtimes may then load these assets when the Rive file is loaded. While this makes for easy usage of the Rive files/runtimes, there may be opportunities to load these assets in or even replace them at runtime instead of embedding them in the file binary.
There are several benefits to this approach:
- Keep the
.riv
files tiny without potential bloat of larger assets - Dynamically load an asset for any reason, such as loading an image with a smaller resolution if the
.riv
is running on a mobile device vs. an image of a larger resolution for desktop devices - Preload assets to have available immediately when displaying your
.riv
- Use assets already bundled with your application, such as font files
- Sharing the same asset between multiple
.riv
s
Methods for Loading Assets
There are currently three different ways to load assets for your Rive files.
In the Rive editor select the desired asset from the Assets tab, and in the inspector choose the desired export option:
See the Export Options section in the editor docs for more details.
Embedded Assets
In the Rive editor, static assets can be included in the .riv
file, by choosing the “Embedded” export type. As stated in the beginning of this page, when the Rive file gets loaded, the runtime will implicitly attempt to load in the assets embedded in the .riv
as well, and you don’t need to concern yourself with loading any assets manually.
Caveat: Embedded assets may bulk up the file size, especially when it comes to fonts when using Rive Text (Text Overview).
Embedded is the default option.
Loading via Rive’s CDN
In the Rive editor, you can mark an imported asset as a “Hosted” export type, which means that when you export the .riv
file, the asset will not be embedded in the file binary, but will be hosted on Rive’s CDN. This means that at runtime when loading in the file, the runtime will see the asset is marked as “Hosted” and load the asset in from the Rive CDN, so that you don’t need need to concern yourself with loading anything yourself, and the file can still remain tiny.
Caveat: The app will make an extra call to a Rive CDN to retrieve your asset
Image CDNs
Some image CDNs allow for on-the-fly image transformations, including resizing, cropping, and automatic format conversion based on the browser’s and device’s capabilities. These CDNs can host your Rive image assets. Note that for these CDNs, you may need to specify the accepted formats, for example, as part of the HTTP header request:
Please see your CDN provider’s documentation for additional information.
Rive support the following image formats: jpeg, png, and webp
Referenced Assets
In the Rive editor, you can mark an imported asset as a “Referenced” export type, which means that when you export the .riv
file, the asset will not be embedded in the file binary, and the responsibility of loading the asset will be handled by your application at runtime. This option enables you to dynamically load in assets via a handler API when the runtime begins loading in the .riv
file. This option is preferable if you have a need to dynamically load in a specific asset based on any kind of app/game logic, and especially if you want to keep file size small.
All referenced assets, including the .riv
, will be bundled as a zip file when you export your animation.
Caveat: You will need to provide an asset handler API when loading in Rive which should do the work of loading in an asset yourself. See Handling Assets below.
Handling Assets
See below for documentation on how to handle loading in assets at runtime for your Rive file with various runtimes.
Examples
- Specify a font asset to load
- Specify an image asset to load
- Out of band assets (fonts) - canvas advanced
Using the Asset Handler API
When instantiating a new Rive instance, add an assetLoader
callback property to the list of parameters. This callback will be called for every asset the runtime detects from the .riv
file on load, and will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
An instance where you may want to handle loading an asset is if an asset in the file is marked as Referenced, and you need to provide an actual asset to render for the graphic, as Rive does not embed it in the .riv
and thus cannot load it.
An instance where you may want to give the runtime a chance to load the asset is if the asset in the file is marked as Hosted, and want to pass the responsibility of loading it to the runtime (which will call into a Rive CDN to do so).
Your provided callback will be passed an asset
and bytes
.
asset
- Reference to aFileAsset
object from WASM. You can grab a number of properties from this object, such as the name, asset type, and more. You’ll also use this to set a new Rive-specific asset for the dynamically loaded in asset you want to set (i.e.RenderImage
for an image,Font
for a font, orAudio
for audio).bytes
- Array of bytes for the asset (if possible, such as if it’s an embedded asset)
Important: Note that the return value is a boolean
, which is where you need to return true
if you intend on handling and loading in an asset yourself, or false
if you do not want to handle asset loading for that given asset yourself, and attempt to have the runtime try to load the asset.
When decoding an asset be sure to call unref
once it is no longer needed - to avoid memory leaks. This allows the engine to clean it up when it is not used by any more animations.
Example Usage
Examples
- Specify a font asset to load
- Specify an image asset to load
- Out of band assets (fonts) - canvas advanced
Using the Asset Handler API
When instantiating a new Rive instance, add an assetLoader
callback property to the list of parameters. This callback will be called for every asset the runtime detects from the .riv
file on load, and will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
An instance where you may want to handle loading an asset is if an asset in the file is marked as Referenced, and you need to provide an actual asset to render for the graphic, as Rive does not embed it in the .riv
and thus cannot load it.
An instance where you may want to give the runtime a chance to load the asset is if the asset in the file is marked as Hosted, and want to pass the responsibility of loading it to the runtime (which will call into a Rive CDN to do so).
Your provided callback will be passed an asset
and bytes
.
asset
- Reference to aFileAsset
object from WASM. You can grab a number of properties from this object, such as the name, asset type, and more. You’ll also use this to set a new Rive-specific asset for the dynamically loaded in asset you want to set (i.e.RenderImage
for an image,Font
for a font, orAudio
for audio).bytes
- Array of bytes for the asset (if possible, such as if it’s an embedded asset)
Important: Note that the return value is a boolean
, which is where you need to return true
if you intend on handling and loading in an asset yourself, or false
if you do not want to handle asset loading for that given asset yourself, and attempt to have the runtime try to load the asset.
When decoding an asset be sure to call unref
once it is no longer needed - to avoid memory leaks. This allows the engine to clean it up when it is not used by any more animations.
Example Usage
Examples
- Specify a font asset to load
- Specify an image asset to load
- Specify an image asset to load (TypeScript)
Using the Asset Handler API
When instantiating a new Rive instance with the useRive
hook, add an assetLoader
callback property to the list of parameters. This callback will be called for every asset the runtime detects from the .riv
file on load, and will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
Note that you can only use the assetLoader
callback with the useRive
hook, and not the default-exported <Rive />
component from the React runtime
See the Web (JS) tab in this table for more API details.
Examples
Using the Asset Handler API
When instantiating a RiveFile
, add an assetLoader
callback property to the list of parameters. This callback will be called for every asset the runtime detects from the .riv
file on load, and will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
An instance where you may want to handle loading an asset is if an asset in the file is marked as Referenced, and you need to provide an actual asset to render for the graphic, as Rive does not embed it in the .riv
and thus cannot load it.
An instance where you may want to give the runtime a chance to load the asset is if the asset in the file is marked as Hosted, and want to pass the responsibility of loading it to the runtime (which will call into a Rive CDN to do so).
Your provided callback will be passed an asset
and bytes
.
asset
- Reference to aFileAsset
object. You can grab a number of properties from this object, such as the name, asset type, and more. You’ll also use this to set a new Rive specific asset for dynamically loaded content. Types:FontAsset
,ImageAsset
, andAudioAsset
.bytes
- Array of bytes for the asset (if possible, such as if it’s an embedded asset)
Important: Note that the return value is a boolean
, which is where you need to return true
if you intend on handling and loading in an asset yourself, or false
if you do not want to handle asset loading for that given asset yourself, and attempt to have the runtime try to load the asset.
Example Usage
Load and cache a collection of fonts. Here we demonstrate loading from Rive’s CDN, but you can load these font files any way you desire.
Swap out the font dynamically:
Examples
Using the Asset Handler API
When instantiating a RiveViewModel
(or RiveFile
directly), add a customLoader
callback property to the list of parameters. This callback will be called for every asset the runtime detects from the .riv
file on load, and the callback will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
An instance where you may want to handle loading an asset is if an asset in the file is marked as Referenced, and you need to provide an actual asset to render for the graphic, as Rive does not embed it in the .riv
and thus cannot load it.
An instance where you may want to give the runtime a chance to load the asset is if the asset in the file is marked as Hosted, and want to pass the responsibility of loading it to the runtime (which will call into a Rive CDN to do so).
Your provided callback will be passed an asset
, data
, and a factory
.
-
asset
- Reference to aRiveFileAsset
object. You’ll use this reference to set a new Rive-specific asset for dynamically loaded content. If you wish to dynamically swap a given image/font over the lifetime of your view, you may want to cache this object. You can grab a number of properties from this object, such as: -
name()
- Name of the asset without the unique file identifier appended, (i.e.picture.webp
instead ofpicture-47982.webp
) -
uniqueFilename()
- Name of the asset with the unique file identifier, (i.e.picture-47982.webp
instead ofpicture.webp
) -
fileExtension()
- Name of the file extension (i.e."png"
) -
cdnBaseUrl()
- Name of the base URL for the CDN -
cdnUuid()
- Identifier for the resource in the Rive CDN. Useful to see if this has length so you can see if the asset is marked for grabbing from a Rive CDN (in which case, you can let the Rive runtime retrieve the asset, rather than your app logic) -
data
- Array of bytes for the asset. This is useful to determine if the asset is already embedded in the Rive file (aka, not marked as “referenced” in the editor) -
factory
- Utility with methods to transform an asset’s bytes into aRiveRenderImage
,RiveFont
, orRiveAudio
which theasset
object uses to render via.renderImage(your-rive-render-image)
,.font(your-rive-font)
, or.audio(your-rive-audio)
. These assets are created by callingfactory.decodeImage(data)
,factory.decodeFont(data)
, orfactory.decodeAudio(data)
Important: Note that the return value of the callback is a boolean
, which is where you need to return:
true
if you intend on handling and loading in an asset yourself, orfalse
if you do not want to handle asset loading for that given asset yourself, and attempt to have the runtime try to load the asset.
Example Usage
Fonts
When using a custom loader, referenced fonts can be loaded one of two ways: with raw data (from a file, as seen above), or with a UIFont
/ NSFont
.
When using UIFont
/ NSFont
, size, weight, and width of the supplied font is ignored. The font will be used as defined in the text run, rather than being overridden by the supplied font’s styling.
Images
When loading assets for referenced images, you may need to scale local assets to the size of an image asset as defined in your Rive file. When using a custom loader, you can access the size of the referenced image via the size
property of a RiveImageAsset
.
Examples
Using the Asset Handler API
When instantiating a new RiveAnimationView
, set a new attribute called riveAssetLoaderClass
whose value is a string name of the full path to a class that will be responsible for either handling the load of an asset at runtime or passing on the responsibility and giving the runtime a chance to load it otherwise.
via XML
In your accompanying activity, create a new class with the name provided to riveAssetLoaderClass
, who should implement the ContextAssetLoader
abstract class from the Rive runtime. Here, you can override a loadContents
function, which will do the work of determining what assets (if any) to load:
asset
- Reference to aFileAsset
object. You can grab a number of properties from this object, such as the name, asset type, and more. You’ll also use this to set a new Rive-specific asset for the dynamically loaded in asset you want to setbytes
- Array of bytes for the asset (if possible, such as if it’s an embedded asset)
Important: Note that the return value is a boolean
, which is where you need to return true
if you intend on handling and loading in an asset yourself, or false
if you do not want to handle asset loading for that given asset yourself, and attempt to have the runtime try to load the asset.
Example Usage
To accompany the XML snippet above, here’s an example of what the accompanying activity may look like:
Examples
Using the Referenced Assets API
React Native has a different API for handling out-of-band assets compared to our other runtimes.
The referencedAssets
prop accepts a key-value object. The key
is the unique identifier of the asset (as exported in the Editor), which combines the asset name and its unique identifier. The value
specifies how to load the asset:
- A source loaded directly from JavaScript.
- A URI pointing to an asset downloaded from the web.
- A bundled asset on the native platform (iOS and Android), included through Xcode and Android Studio, respectively.
You can optionally exclude the unique identifier. For example, instead of Inter-594377
, you can use Inter
. However, it is recommended to use the full identifier to avoid potential conflicts. Using just the asset name allows you to avoid knowing the unique identifier and gives you more control over naming.
The following code sample illustrates the three different ways an asset can be loaded:
Additional Resources
Was this page helpful?