Creative Communities of the World Forums

The peer to peer support community for media production professionals.

Activity Forums Adobe After Effects Expressions Delay + index PropertyGroup on Text Animator

  • Delay + index PropertyGroup on Text Animator

    Posted by John Burgess on April 23, 2023 at 2:22 pm

    Looking to make a delay + index expression work with a text animator.
    I’m guessing this needs PropertyGroup adding somewhere though was struggling to find much online.

    Was looking for the position of ‘Letter 2’ to delay ‘Letter 1’ and keep incrementing when duplicated

    Brie Clayton replied 1 year, 2 months ago 4 Members · 9 Replies
  • 9 Replies
  • Dan Ebberts

    April 23, 2023 at 3:49 pm

    I think we need more info on what it is that you’re trying to do exactly, and maybe an example of what it would look like.

  • John Burgess

    April 23, 2023 at 6:44 pm

    Hi Dan,

    I was trying to achieve something similar to your classic delay expression but work on a single text layer using text animators

    delay = 5; //number of frames to delay

    d = delay*thisComp.frameDuration*(index - 1);

    thisComp.layer(1).position.valueAtTime(time - d)

    I want to be able to delay the position for every text animator in the stack. Like in the GIF

    I know this can be done much simpler using a range selector but find the control if it lacking compared to delay and offsetting it by a set number of frames

  • Filip Vandueren

    April 23, 2023 at 7:52 pm

    To automate that all the ranges (which you duplicate yourself) are sequential:

    Range, based on Characters index, from 0 to 1, offset has this expression:


    The first Animator has its properties keyframed (position in your example), the following ranges’ properties have this expression:

    delay = thisComp.frameDuration*2; // 

    You’ll notice that the propertyGroup counts are not intuitive if you try to count up by eyeballing the levels of properties you see in the timeline, because there are some hidden levels: An Animator has a hidden propertyGroup of “Selectors” and a hidden PropertyGroup of “Properties”, and also the animators themselves are inside a propertyGroup “Animators”, all these levels are not represented by a twirly > in the timelines structures.

    So, counting up from a property Position to the Pool of animators it is a child of takes 3 steps:

    layer ("Text") ("Animators") ("Animator 1") ("Properties") ("Position")
  • John Burgess

    April 23, 2023 at 8:19 pm

    Thanks so much Filip, this worked perfect

  • Dan Ebberts

    April 23, 2023 at 8:56 pm

    Since it’s all one text layer, did you consider using a single Expression Selector, where you could use something like this for the Amount:

    delay = 5; //number of frames to delay
    d = delay*thisComp.frameDuration*(textIndex);
    d0 = delay*thisComp.frameDuration*(textIndex-1);
  • John Burgess

    April 23, 2023 at 9:19 pm

    Thanks Dan, yes! this simplifies things

  • Filip Vandueren

    April 24, 2023 at 7:37 am

    Hey Dan,

    I tried it, and for me this does the characters one by one like a square selector instead of with an overlapping delay.

    The only way I can get a delay in an expression selector to work with custom keyframes/timings is to have the actual keyframes somewhere else (in another deactivated animator, or in a point control, on a Null…), because once a property is already keyframed down to 0, no amount between -100 and 100 is going to change it to be anything else.

    My approach with Position expressions Selectors is to give the property a fixed value of 10,000;10,000 and then use the amount expression to use percentages to turn those into pixel positions. (It’s unfortunate that all selectors are limited form -100% to 100%)

    I’d love to hear your thoughts on this technique, maybe there’s another approach with expression selectors?

    Animation Delay

  • Dan Ebberts

    April 24, 2023 at 2:10 pm

    You can get the expression selector movements to overlap if you decouple move time from the delay, like this maybe:

    delay = 5; //number of frames to delay
    dur = 7;
    d0 = delay*thisComp.frameDuration*(textIndex-1);

    But yes, the technique appears to be clamped to the range from -100 to 100, so it’s only suitable for specific cases.

  • Brie Clayton

    April 25, 2023 at 3:26 pm

    Thank you, Dan and Filip, for solving this issue!

We use anonymous cookies to give you the best experience we can.
Our Privacy policy | GDPR Policy