When used with care, animation can be much more than a mere gimmick—it can improve the quality of the user experience. Subtlety is the key to using animation effectively: the best UI animations are the ones your users don’t notice because they feel natural.
I created a small helper class called FadeImageView that wraps Android’s standard ImageView, applying an automatic fade transition when changing pictures. I have started using this class everywhere that I would normally use an ImageView.
The animated fading effect is particularly nice in cases where a placeholder image is later replaced with an image that is downloaded from the Internet. The result is a smooth transition that makes the change less jarring.
Without further ado, the following is the code:
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Graphics;
using Android.Views.Animations;
using Android.Graphics.Drawables;
namespace Foo
{
public class FadeImageView : ImageView
{
Animation fadeInAnimation;
Animation fadeOutAnimation;
public FadeImageView (Context ctx) : base (ctx)
{
Initialize ();
}
public FadeImageView (Context context, IAttributeSet attrs) :
base (context, attrs)
{
Initialize ();
}
public FadeImageView (Context context, IAttributeSet attrs, int defStyle) :
base (context, attrs, defStyle)
{
Initialize ();
}
void Initialize ()
{
fadeInAnimation = new AlphaAnimation (0, 1) {
Duration = 500
};
fadeOutAnimation = new AlphaAnimation (1, 0) {
Duration = 100
};
}
void DoAnimation (bool really, Action changePic)
{
if (!really)
changePic ();
else {
EventHandler<Animation.AnimationEndEventArgs> callback = (s, e) => {
changePic ();
StartAnimation (fadeInAnimation);
fadeOutAnimation.AnimationEnd -= callback;
};
fadeOutAnimation.AnimationEnd += callback;
StartAnimation (fadeOutAnimation);
}
}
public void SetImageBitmap (Bitmap bm, bool animate)
{
DoAnimation (animate, () => SetImageBitmap (bm));
}
public void SetImageDrawable (Drawable drawable, bool animate)
{
DoAnimation (animate, () => SetImageDrawable (drawable));
}
public void SetImageResource (int resId, bool animate)
{
DoAnimation (animate, () => SetImageResource (resId));
}
public void SetImageURI (Android.Net.Uri uri, bool animate)
{
DoAnimation (animate, () => SetImageURI (uri));
}
}
}
To use it, replace occurences of ImageView with FadeImageView. You can use it in Android XML layouts or in code. To activate the animation, simply use the overload accepting a boolean.