Modifying Lottie Animation with Value Providers

栏目: IT技术 · 发布时间: 4年前

内容简介:Imagine you downloaded a piece of Lottie animation, you really like the animation and you want to use it in your iOS app. Unfortunately, the colors of the animation do not match your app’s theme. What should you do?What if you have a black color Lottie ani

Imagine you downloaded a piece of Lottie animation, you really like the animation and you want to use it in your iOS app. Unfortunately, the colors of the animation do not match your app’s theme. What should you do?

What if you have a black color Lottie animation that does not look good in dark mode, you want to dynamically change the animation appearance based on the app’s user interface style. Is that even possible?

Fear not! Lottie animation is rendered natively at run time, therefore, modifying the animation programmatically is definitely possible.

Introducing Value Providers — Classes that developers can utilise to easily modify the animation properties at run time.

Lottie has total of 5 prebuilt value providers:

ColorValueProvider
FloatValueProvider
SizeValueProvider
PointValueProvider
GradientValueProvider

Before we dive deep into these value providers, if you are not familiar with Lottie, make sure to check out my previous articles that related to Lottie:

With all that being said, let’s begin.

The Concept

All the elements within a Lottie animation are represented by nodes, in order to access a node, we must know the key path of the node. Following are a few key path examples:

// Represents a specific color node on a specific stroke.
"Layer.Shape Group.Stroke 1.Color"

// Represents the color node for every Stroke in a specific layer and shape group.
"Layer.Shape Group.Stroke *.Color"

// Represents the color node for every Stroke named "Stroke 1" in the animation.
"**.Stroke 1.Color"

Note:

Lottie animation’s key path accepts single-asterisk (*) and double-asterisk (**) wildcard match. The single-asterisk will search a single depth for the next node, meanwhile, the double-asterisk will search any depth.

Up until this point, you might wonder how you can get all the key paths of an animation. Luckily Lottie does provide an API that we can use to list out all key paths of an animation into the Xcode console.

AnimationView.logHierarchyKeypaths()
Modifying Lottie Animation with Value Providers
Listing out key paths in Xcode console

With all the animation’s key paths being listed out, we are now ready to modify Lottie animations using value providers.

The Color, Float and Size Value Provider

In this section, I will be using the TwitterHeart animation as an example.

Modifying Lottie Animation with Value Providers
The original TwitterHeart animation

I will show you how to change the heart’s background color, scale up the explosion effect, and reduce all the dots’ opacity by using different types of value providers. Here’s what we trying to achieve:

Modifying Lottie Animation with Value Providers
The modified TwitterHeart animation

Changing Color with ColorValueProvider

In order to change the heart’s background color, we must first find out the key paths that represent the heart’s color node.

By performing a search on the key path list using the word “Color”, you should be able to identify all the layers with a color node. Since all the key path’s names are self-explanatory, figuring out which key path is representing the heart’s color node is pretty straightforward.

After going through all the color nodes, following are the 2 key paths that represent the heart’s color node where H1 and H2 are representing the heart’s layer before and after the explosion effect, respectively.

H1.Shape 1.Fill 1.Color
H2.Shape 1.Fill 1.Color

After identifying the correct color node, let’s write some code to change the heart to orange color.

// Create ColorValueProvider using Lottie's Color class
let orange = Color(r: (251/255), g: (140/255), b: (0/255), a: 1)
let orangeColorValueProvider = ColorValueProvider(orange)

// Set color value provider to animation view
let keyPath = AnimationKeypath(keypath: "**.Shape 1.Fill 1.Color")
animationView.setValueProvider(orangeColorValueProvider, keypath: keyPath)

Note how we are using the double-asterisk (**) wildcard match to represent both H1 and H2 .

Scaling Up withSizeValueProvider

Next up, let’s scale up the explosion effect. There are 2 major components that are involved in the explosion effect — the dots and the ellipse.

Modifying Lottie Animation with Value Providers
Dots and ellipse in TwitterHearth

You can do a “Scale” keyword search on the key path list to find out all the scalable node’s key paths. For convenience’s sake, I have identified all the related key paths.

C1.Ellipse 1.Scale
C2.Ellipse 1.Scale

Dot1.Shape 1.Scale
Dot2.Shape 1.Scale
...
...
Dot14.Shape 1.Scale

Pro Tip:

If you find it hard to identify the correct key path, try changing the color of a layer to help you visualize the relationship between each key path and its layer.

Once again, we can use the wildcard match to represent the key paths, but this time we will use the single-asterisk (*) wildcard match.

With that, we are ready to scale up the explosion effect using the SizeValueProvider .

// Scale up dots & ellipse
let scaleValueProvider = SizeValueProvider(CGSize(width: 200, height: 200))

let dotKeyPath = AnimationKeypath(keypath: "Dot*.Shape 1.Scale")
animationView.setValueProvider(scaleValueProvider, keypath: dotKeyPath)

let ellipseKeyPath = AnimationKeypath(keypath: "C*.Ellipse 1.Scale")
animationView.setValueProvider(scaleValueProvider, keypath: ellipseKeyPath)

Adjusting Opacity with FloatValueProvider

Lastly, let’s change the opacity of all the dots by using the FloatValueProvider .

Changing the opacity of all the dots is just like changing the scale of all the dots, hence we can modify the key paths that we obtained in the previous section and point it to the dots’ opacity node.

Dot*.Shape 1.<strong>Opacity</strong>

The code to change the opacity using FloatValueProvider is fairly straightforward:

// Change dots opacity (range 0 ~ 100)
let opacityValueProvider = FloatValueProvider(CGFloat(50))
let dotOpacityKeyPath = AnimationKeypath(keypath: "Dot*.Shape 1.Opacity")
animationView.setValueProvider(opacityValueProvider, keypath: dotOpacityKeyPath)

Do take note that the opacity value ranges from 0 to 100. This means that for our example, we are changing all the dots’ opacity to 50%.

With that, we have completed the TwitterHeart animation modification. Let’s take a look at the final product.

Modifying Lottie Animation with Value Providers
The modified TwitterHeart animation

The Point and Gradient Value Provider

To showcase the PointValueProvider and GradientValueProvider , we will need an animation that contains gradient nodes. Due to that, I will use the voice-video-switch animation downloaded from lottiefiles.com .

Modifying Lottie Animation with Value Providers
The original voice video switch animation

For demonstration purposes, let’s change the gradient colors to be more blueish and also slightly move up the centre circle to make it look more like a camera.

Modifying Lottie Animation with Value Providers
The modified voice video switch animation

Changing Gradient with GradientValueProvider

As usual, we will start with identifying the key paths that we should use. For gradient nodes, they are marked with the “Colors” keyword.

If you do a search on the key path list, you should find 4 key paths marked with “Colors”.

Touch.Rectangle 1.Gradient Stroke 1.Colors
Left.Rectangle 1.Gradient Stroke 1.Colors
Right.Rectangle 1.Gradient Stroke 1.Colors
Centre.Rectangle 1.Gradient Stroke 1.Colors

Since we want to make the entire animation more blueish, changing the gradient value of all these nodes should be the way to go.

// Create gradient colors
let color1 = Color(r: (0/255), g: (80/255), b: (115/255), a: 1)
let color2 = Color(r: (113/255), g: (199/255), b: (236/255), a: 1)
let gradientValueProvider = GradientValueProvider([color1, color2])

// Set gradient provider
let gradientKeyPath = AnimationKeypath(keypath: "**.**.**.Colors")
animationView.setValueProvider(gradientValueProvider, keypath: gradientKeyPath)

Note:

You can initialize a GradientValueProvider with more than 2 colors.

Lastly, make sure to change the foot rectangle color as well to match the new blueish color.

Modifying Lottie Animation with Value Providers
The foot rectangle
// Set color of foot rectangle
let colorValueProvider = ColorValueProvider(color1)
let footKeyPath = AnimationKeypath(keypath: "Foot.Rectangle 1.Stroke 1.Color")
animationView.setValueProvider(colorValueProvider, keypath: footKeyPath)

Repositioning with PointValueProvider

Repositioning the centre circle is a little bit tricky because we have no idea what is the centre circle’s current position. However, we can set the centre circle back to (0, 0) position and work our way from there.

let pointValueDeveloper = PointValueProvider(CGPoint(x: 0, y: 0))
let centrePositionKeyPath = AnimationKeypath(keypath: "Centre.Rectangle 1.Position")
animationView.setValueProvider(pointValueDeveloper, keypath: centrePositionKeyPath)
Modifying Lottie Animation with Value Providers
Centre circle at (0, 0) position

As can be seen from the above image, by moving the centre circle back to (0, 0) position and assuming (0, 0) is at the centre of the circle, we can iterate through various x and y values to find the position that we want.

After a few trial and error, I found that repositioning the centre circle to (-18, 80) perfectly fits our needs.

let pointValueDeveloper = PointValueProvider(CGPoint(x: -18, y: 80))

That’s it! We have successfully transformed the voice-video-switch animation to what we want.

Modifying Lottie Animation with Value Providers
The modified voice video switch animation

Wrapping Up

The examples being shown in this article only cover a small portion of what you can modify using the value providers. Properties such as rotation, size, stroke width, etc., are also available for modification.

Feel free to get the sample project from Github and start experimenting with it yourself.

Last but not least, make sure to check out the Lottie Editor where you can use it to make minor adjustments on a Lottie animation and export it as Lottie JSON format.

I will be covering some other iOS development topics including topics related to Lottie animation in my future articles. If you would like to get notified when a new article comes out, you can follow me on Twitter and subscribe to my monthly newsletter.

I will be covering some other topics related to iOS development including Lottie animation in my future articles. If you would like to get notified when a new article comes out, you can follow me on Twitter and subscribe to my monthly newsletter.

Thanks for reading. ‍:computer:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人工智能

人工智能

Peter Norvig、Stuart Russell / 姜哲 / 人民邮电出版社 / 2004-6 / 85.00元

《人工智能:一种现代方法》(第2版中文版)以详尽和丰富的资料,从理性智能体的角度,全面阐述了人工智能领域的核心内容,并深入介绍了各个主要的研究方向,是一本难得的综合性教材。全书分为八大部分:第一部分“人工智能” ,第二部分“问题求解” ,第三部分“ 知识与推理” ,第四部分“规划” ,第五部分“不确定知识与推理” ,第六部分“学习” ,第七部分“通讯、感知与行动” ,第八部分“ 结论” 。一起来看看 《人工智能》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具