package pl.droidsonroids.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.ImageButton; import android.widget.ImageView; import java.io.IOException; /** * An {@link ImageButton} which tries treating background and src as {@link GifDrawable} * * @author koral-- */ public class GifImageButton extends ImageButton { /** * A corresponding superclass constructor wrapper. * * @see ImageView#ImageView(Context) */ public GifImageButton(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) */ public GifImageButton(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) */ public GifImageButton(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(GifImageView.ANDROID_NS, "src", -1); if (resId > 0 && "drawable".equals(res.getResourceTypeName(resId))) { setResource(true, resId, res); } resId = attrs.getAttributeResourceValue(GifImageView.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 ignored) { //ignored } catch (NotFoundException ignored) { //ignored } if (isSrc) { super.setImageResource(resId); } else { super.setBackgroundResource(resId); } } //TODO add setImageURI }