Search code examples
animationwatchkitapple-watch

How to animate vector graphics on the Apple Watch?


Since most devices today have a CPU and a GPU, the usual advice for programmers wishing to do animated vector graphics (like making a circle grow or move around) is to define the graphical item once and then use linear transformations to animate it. This way, (on most platforms and frameworks) the GPU can do the animation work, because rasterization with linear transformations can be done very fast on a GPU. If the programmer chooses to draw each frame on the CPU, it would most likely be much slower and consume more energy.

I understand that the Watch is not a device you want to overload with complex animations, but at least the Home Screen certainly seems to use exactly this kind of animated linear transformations:

enter image description here

Also, most Watch Faces are animated in a way, e.g. the moving seconds and minutes hands.

However, the WatchKit controls do not have a .transform property, and I could not find much in the documentation - the words "animation" and "graphics" are not even mentioned there.

So, the only way I currently see is to draw the vector graphics to a CGContext and then put the result as an UIImage to a image control, as described here. But this does not really seem energy-efficient. It is exactly the kind of "CPU pixel drawing" that we usually want to avoid if possible. I think it is not energy-efficient because if I draw on a 100x100 pixels image buffer, the image has to be scaled to the actual Watch screen size, so we have two actual drawing processes per frame.

Is there a officially recommended, energy-efficient way to do animations on the Apple Watch?

Or, in other words, can we animate things like they are animated on the Home Screen or Watch Faces?


Solution

  • Seems SpriteKit is the answer. You can create SKScene and node objects and then display them in a WKInterfaceSKScene.