These new APIs are great, but they are not quite compatible with older devices, thus Google provided a support library to solve this problem.
While building my app, I’m trying to use the compat fragment to support as many devices as possible, meanwhile, I want to take advantage of new set of animation apis to create animation easier.
The FragmentTransaction class has a simple API named
setCustomAnimations() to set the animation while switching fragments. But, sadly, when I tried to use the animator xml file (I mean, using property animation elements like
<objectAnimator> in the animation xml) on Gingerbread emulator (with API level less than 11), the app simply crashed complaining it does not understand the
objectAnimator sh*t, which means you have to give up on the new animation API with compat fragment.
And finally, I managed to find a way to get this work. Here’s what I’ve tried.
If you are urged to see a demo, please check the readme of this sample on github.
The fragment is quite simple, it will generate a colored rounded rectangle as the view of the fragment, whose color can be specified as a argument of the constructor.
In order to use the new animation api on older versions of android, I found of the NineOldAndroids project.
Even though I didn’t quite get its name (sad), the project is really awesome. It somehow managed to give the developer a way to use the new animation apis even on Android 1.0, amazing. It’s fun, but the only way is you cannot put them in XML files, still need to work out how to use the animation.
Not being able to use the animation in XML files, I have to write some code to make this happen. Here’s a methods I defined to trigger the new animation.
This is the first part of the animation, the old fragment fliped to disappear by changing the
rotationY property from 0 to 90 degree. Once this animation is finished, I need to replace the old fragment with the new one by calling
But we cannot simply let the new fragment appear and be there, it will be awkward. So, I’ve designed a callback that will be triggered once the new fragment’s view is ready, the code is listed below.
Once the view is created, I’ll kick off the second part of the animation, which changes the
rotationY property from -90 degree to 0. Here’s the code.
And now, the animation is working perfectly.
I’ve created a project on github, called FragmentCompatAnimator, make sure to check it out.
It is always a good idea to use new APIs for better performance and use experience. But compatibilty is a tough problem. Thanks to all opensource framework contributors, it is and will be easier for us developers to take advantage of the new APIs but still be able to make it work on older devices.