I’m animating dots shapes from typography converted to shapes scaling up with overlapping animation. There are lots of circles in a shape layer and I want them to come on with a X frames distance. Is there a way you can offset keyframes like you can layer or do I have to do it manually? What would be your fastest way of doing it with an expression?
So far I have these 2 options, but they only work towards one shapes group but it doesn't propagate towards groups 3,4, and so on
for x5 frames offset
offset = .2;content(“NAME OF THE GROUP“).transform.scale.valueAtTime(time-offset);
for x1 frame offset
offset = thisComp.frameDuration;content(“NAME OF THE GROUP“).transform.scale.valueAtTime(time-offset);
You misunderstand how expressions work. Their scope is limited to whatever property they are applied to and they can only "look up" external values, but you cannot enforce anything downstream by just applying it to a single property and hoping it will ripple through the group. If at all, you'd have to copy & paste the expression to all matching properties. That said, even then your code is incomplete as of course in order to get an actual gradual expansion you'd have to multiply the delay and offset values by some sort of index per item, but that entirely depends on how your shapes are organized and how you want them to be scaled. At the very least you have to provide some screenshots. Otherwise, if you're really only dealing with dots you may want to explore other techniques like this one:
There's many more, but really, you have to be more specific and explain in more detail what you are looking to achieve.
It's not exactly clear how you want this thing to sequence, but in any case, an expression that needs to figure out where it is, timing-wise, in the sequence, requires it to know how you have the shape layer structured. You can use propertyGroup() to navigate the levels of the hierarchy, but it can be tricky because there are hidden levels that you need to take into account. It would be helpful if you can post a screen shot of your timeline with all the shape layer levels exposed.
Thank you for your reply. Very helpful to touch base and explore some options.
I'm creating a setup so my team can quickly animate dots from corporate typography whenever we need to deal with text under the agreed animation style (this is the scale-up of each dot for each letter with an offset of 1 to 5 frames). At the moment we need to animate de dots that shape the letters manually and once we convert to shapes each letter, we finish having several groups all named sequentially.
The aim here is:
1-Finding a way to expression values inside a single layer that hosts several groups vs sequence animation of several layers (it will delay the workflow if we have to, after converting each letter to shapes, then split each dot into a single layer and the sequence layers to achieve the offset)
2- Offsetting each group scale animation based on the previous group id (group number)
I'm attaching 3 screenshots of how one dot would animate, so my aim is to find a way to animate the whole letter's dots sequentially with an expression.
Can you post a project file that has what you're showing in the screenshots (circle letters converted to shapes)?
I'm not sure this is ultimately what you're after, but this will sequence the dots in the B2 letter groups to follow the scale animation of the dot in Group 1:
offset = .1; id = thisProperty.propertyGroup(2).propertyIndex; content("B 2").content("Group 1").transform.scale.valueAtTime(time-id*offset)
BTW, the file I downloaded looks like the one you posted your screenshots from (I don't know if that was your intention). In any case, I ended up where the expression error was: in the START_01 comp, GREAT DEAL ON BROADBAND 2 Outlines layer/Contents/B2/Group 2/B/Transform: Group 2/Scale
Thank you Dan,
I tried your expression but it is sending me an error. I had attached a screenshot.
I amended it to this one
offset = .1;
id = thisProperty.propertyGroup(2).propertyIndex;
content("B 2").content("Group 2").transform.scale.valueAtTime(time-id*offset)
The part I changed is the content ("Group 1") with ("Group 2")
And it works!