AnimateItem Command
AnimateItem
requires APL 1.1 or later. Provide an alternate experience for devices running older versions of APL.
Runs a fixed-duration animation sequence on one or more properties or bound values of a single component.
Properties
The AnimateItem
command has the properties shown in the following table, in addition to the common command properties. Set the type
property to AnimateItem
.
In the following table, the "Default" column shows "Required" for properties that must have a value for the command to run. Otherwise it displays the default value, which might be none.
Property | Type | Default | Description |
---|---|---|---|
|
|
The component to animate. | |
|
Integer |
REQUIRED |
The duration of the animation (in milliseconds) |
|
linear, ease-in, … |
linear |
Specify an easing curve. |
|
Integer |
0 |
Number of times to repeat. |
|
restart, reverse |
restart |
How repeated animations will play. |
|
Array of animated properties |
REQUIRED |
An array of animated component properties. |
In fast mode, the AnimateItem
command jumps ahead to the end state of
the animation. When an AnimateItem
command stops, the animation jumps ahead to the
end state; refer to repeatMode for a discussion of how to calculate the end state.
componentId
A selector that identifies the component to animate. When not provided, defaults to :source
. The :source
selector targets the component that issued the AnimateItem
command.
duration
The duration in milliseconds of a single pass of the animation. If the repeatCount
property is set to greater than 0, the total duration of the animation will be the product of the duration and one more than the repeat count. For example, the following animation will have a total duration of 10 seconds:
{
"type": "AnimateItem",
"duration": 1000,
"repeatCount": 9,
"repeatMode": "reverse",
"value": {
"property": "opacity",
"from": 0,
"to": 1
}
}
easing
An easing curve specifies how the value of the parameter changes over time. The curve must be a function starting at (0,0) and ending at (1,1). Two standard general ways of writing an easing curve are defined:
cubic-bezier(x1,y1,x2,y2)
: Following the CSS standard, this defines a cubic Bézier curve with starting point (0,0) and ending point (1,0). The parameterized values (x1, y1) and (x2, y2) defined the interior control points of the curve and are normally between 0 and 1.path(x1,y1,...,xN,yN)
: A linear-piecewise function from (0,0) to (1,1). The x values must be in ascending order and between 0 and 1; the y values may be arbitrary. The end values of (0,0) and (1,1) are implicit.
The following easing curves are pre-defined:
Name | Equal to |
---|---|
linear | path() |
ease | cubic-bezier(0.25, 0.10, 0.25, 1.00) |
ease-in | cubic-bezier(0.42, 0.00, 1.00, 1.00) |
ease-out | cubic-bezier(0.00, 0.00, 0.58, 1.00) |
ease-in-out | cubic-bezier(0.42, 0.00, 0.58, 1.00) |
The following example shows a custom easing curve.
{
"type": "AnimateItem",
"easing": "path(0.25, 0.6, 0.5, 0.8, 0.75, 0.9)",
"duration": 1000,
"value": {
"property": "opacity",
"to": 1
}
}
repeatCount
The repeatCount defines how many times an animation will repeat before the command stops. By default, the repeatCount is set to 0; the animation will play through once and stop.
repeatMode
The repeatMode
defines whether animations will be played from start to
finish each time or if the animation will play backwards to the start
each alternative time. The following repeat modes are defined:
Name | Description |
---|---|
restart | The animation starts over from the original value on each repeat. |
reverse | The animation reverses direction each time. |
The end state of an animation is a function of the repeatCount
and
repeatMode
. If the repeatMode
is reverse and the repeatCount
is an odd
number, the animation end state will be the same as its starting state.
In all other cases the end state will be the "natural" end state
assigned as the to
value.
A prematurely stopped animation always "jumps" to its end state.
value
The array of animated properties. Each element in the array has the following form:
Property | Type | Required | Description |
---|---|---|---|
from |
Number | No | The starting value of the property |
property |
String | Yes | The name of the property to animate |
to |
Number | Yes | The ending value of the property |
A property animation is defined by the to/from properties or the inputRange/outputRange properties. If you don't specify a "from" value, the current value of the property is used.
There are a few special cases to consider with the
transform
property.
First, the transform
property
does not implicitly define a from
property; both the from
and to
properties must be set.
Second, interpolating between smoothly between transformations requires
that the same series of transformation operations appear in the from
list and the to
list and in the same order. For example:
"from": [ { "translateX": 30 }, { "rotate": 90 }],
"to": [ { "translateY": 30 }, { "rotate": 45 }]
is a valid from/to
transformation because each array contains a
translation followed by a rotation. A non-working example:
"from": [ { "translateX": 30 }, { "scale": 1 }, { "rotate": 90 }],
"to": [ { "scale": 2 }, { "rotate": 45 }]
In this case the arrays don't match; they have different lengths and
the first element differs between the arrays. The APL author may expect
the system to automatically fill in the "missing"
{ "translateX": 0 }
transformation at the start of the to
array, but
the APL runtime is not clever enough to automatically find and fix the
difference.
Component properties you can animate
Components support animating opacity
and transform
properties. The from
value isn't required for opacity, but you must provide it for transforms.
{
"type": "AnimateItem",
"easing": "ease-in-out",
"duration": 600,
"componentId": "myFlyingComponent",
"value": [
{
"property": "opacity",
"to": 1
},
{
"property": "transform",
"from": [
{
"translateX": 200
},
{
"rotate": 90
}
],
"to": [
{
"translateX": 0
},
{
"rotate": 0
}
]
}
]
}
You can animate bound properties. The following example displays a Frame
as a green box in the center of the viewport. The Frame
defines an animation in which tapping the component animates the SIDE
bound value. The animation changes the size and color of the Frame
smoothly over one second.
Click the green box in the simulator pane to see the animation. Click a second time to see the same animation in reverse.
You can also animate parameters passed to a vector graphic.
The following example defines a box with a thin stroke value as a vector graphic. Tapping the vector graphic starts an animation in which the line thickness of the box expands until the box is solid. Then the animation reverses to return to the original shape.
Click the blue box in the simulator pane to see the animation.
Reinflation strategy
When the Reinflate
command runs, the AnimateItem
can resume after Alexa reinflates the document. The command resumes when it runs on a sequencer
that is specified in the preservedSequencers
array on Reinflate
.
The following properties are saved:
repeatCount
value
componentId
This is the same behavior as preserving each of these properties for the target Component
. For details about preserving component properties, see the preserve
property.
If the target component doesn't exist in the reinflated hierarchy or if the property does not exist, then the command is ignored.
For example, assume the following AnimateItem
command is running on the EXAMPLE_SEQUENCER
sequencer (t = 0 ms).
{
"type": "AnimateItem",
"sequencer": "EXAMPLE_SEQUENCER",
"duration": 1000,
"easing": "linear"
"componentId": "MyComponent"
"repeatCount": 1,
"value": {
"property": "PROPERTY",
"from": 0,
"to": 1
}
}
At t = 500 ms, Reinflate
command runs and preserves the EXAMPLE_SEQUENCER
sequencer. The document reinflates and the reinflated document has a component with the id
MyComponent
and bound value PROPERTY
. The value for this property of MyComponent
is set to 0.5 and the AnimateItem
command continues to run its first iteration.
At t = 1 s, the second iteration of the command runs, setting the bound value to 0 and animating the value to 1.
Last updated: frontmatter-missing