package python.gif;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ImageView;
import java.io.IOException;
/**
* An {@link ImageView} which tries treating background and src as
* {@link GifDrawable}
*
* @author koral--
*/
public class GifImageView extends ImageView {
static final String ANDROID_NS = "http://schemas.android.com/apk/res/android";
/**
* A corresponding superclass constructor wrapper.
*
* @see ImageView#ImageView(Context)
* @param context
*/
public GifImageView(Context context) {
super(context);
}
/**
* Like eqivalent from superclass but also try to interpret src and
* background attributes as {@link GifDrawable}.
*
* @see ImageView#ImageView(Context, AttributeSet)
* @param context
* @param attrs
*/
public GifImageView(Context context, AttributeSet attrs) {
super(context, attrs);
trySetGifDrawable(attrs, getResources());
}
/**
* Like eqivalent from superclass but also try to interpret src and
* background attributes as GIFs.
*
* @see ImageView#ImageView(Context, AttributeSet, int)
* @param context
* @param attrs
* @param defStyle
*/
public GifImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
trySetGifDrawable(attrs, getResources());
}
@Override
public void setImageResource(int resId) {
setResource(true, resId, getResources());
}
@Override
public void setBackgroundResource(int resId) {
setResource(false, resId, getResources());
}
void trySetGifDrawable(AttributeSet attrs, Resources res) {
if (attrs != null && res != null && !isInEditMode()) {
int resId = attrs.getAttributeResourceValue(ANDROID_NS, "src", -1);
if (resId > 0 && "drawable".equals(res.getResourceTypeName(resId)))
setResource(true, resId, res);
resId = attrs.getAttributeResourceValue(ANDROID_NS, "background",
-1);
if (resId > 0 && "drawable".equals(res.getResourceTypeName(resId)))
setResource(false, resId, res);
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@SuppressWarnings("deprecation")
// new method not avalilable on older API levels
void setResource(boolean isSrc, int resId, Resources res) {
try {
GifDrawable d = new GifDrawable(res, resId);
if (isSrc)
setImageDrawable(d);
else if (Build.VERSION.SDK_INT >= 16)
setBackground(d);
else
setBackgroundDrawable(d);
return;
} catch (IOException e) {
// ignored
} catch (NotFoundException e) {
// ignored
}
if (isSrc)
super.setImageResource(resId);
else
super.setBackgroundResource(resId);
}
}