Next Frame In Symbol Or Next Keyframe


1. Symbol mode Shift+.
Displays the next frame of the internal Timeline of the currently selected Graphic Symbol(s).

2. Symbol Auto-key mode
Same as 1. but also converts the current frame to a Keyframe before changing the ‘First Frame’.

3. Keyframe mode Alt+.
Moves the playback head (jumps) to the next Keyframe on the currently active layer.

Suggested use

1. Eliminates the need to type numerical value in the ‘First frame’ box in the Looping section in Symbol properties.

2. Allows automatic conversion to a Keyframe as well as setting the ‘First frame’ with the same key press.

3. Allows quick and easy preview of existing keys in animation, skipping the tweens, for better control over refined posing in a mutli-pass animation process.

Where does it work?

1. and 2. One or more selected Graphic Symbol(s) on Stage or Timeline
3. Everywhere, Current layer

EDAP Tools shortcut

Shift+. (symbol mode); (auto-key mode); Alt+. (keyframe mode)


Allows intuitive and quick access to the contents of image containers. The method is an extremely efficient alternative of Symbol swapping.

Video demonstration

All our videos are 1080p. If for some reason full HD is not available here, try watching them on YouTube.

This command is part of the Flanimate Power Tools package. Download the latest version from the Downloads page.

Hi, before I found your solution, I tried to do it myself 🙂
I think you can add a keyframe to the symbol change when it’s not there.
See the code I have at home.
Unfortunately for some reason it doesn’t work well with frame picker.


//detects the current frame of the selected symbol
var tml = fl.getDocumentDOM().getTimeline();
var current = fl.getDocumentDOM().getTimeline().currentFrame;
var currentKeyFrames = getKeyFrames(tml);
var selection = fl.getDocumentDOM().selection[0];

// fl.trace( currentKeyFrames );
// fl.trace( current );
// fl.trace( currentKeyFrames[0].indexOf( Number(current) ) );

if( currentKeyFrames[0].indexOf(current) > -1) {

var index = tml.layers[0].frames[current].elements.indexOf(selection);

if(index > -1 && index fl.getDocumentDOM().selection[0].libraryItem.timeline.layers[0].frames.length-1 ) {
fl.getDocumentDOM().selection[0].firstFrame = 0;
} else {
fl.getDocumentDOM().selection[0].firstFrame = first + 1;
} else {

function getKeyFrames( tml ){
this.isKeyFrame = function( timeline, layerNum, frameNum ){
if( ! timeline.layers[ layerNum ].frames[ frameNum ] ){
return false;
return ( timeline.layers[ layerNum ].frames[ frameNum ].startFrame === frameNum );

var retval = [];

for( var i = 0; i < tml.layers.length; i++ ){
var layerKeyFrames = [];
for( var j = 0; j < tml.layers[ i ].frames.length; j++ ){
if( this.isKeyFrame( tml, i, j ) ){
layerKeyFrames.push( j );
retval.push( layerKeyFrames );
return retval;

Leave a Reply