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.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.widget.TextView; import java.io.IOException; /** * A {@link TextView} which handles GIFs as compound drawables. NOTE: * {@code android:drawableStart} and {@code android:drawableEnd} from XML are * not supported but can be set using * {@link #setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int)} * * @author koral-- */ public class GifTextView extends TextView { /** * @param context */ public GifTextView(Context context) { super(context); } /** * @param context * @param attrs */ public GifTextView(Context context, AttributeSet attrs) { super(context, attrs); parseAttrs(attrs); } /** * @param context * @param attrs * @param defStyle */ public GifTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); parseAttrs(attrs); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void parseAttrs(AttributeSet attrs) { if (attrs != null) { Drawable left = getGifOrDefaultDrawable( attrs.getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableLeft", 0)), right = getGifOrDefaultDrawable(attrs .getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableRight", 0)), top = getGifOrDefaultDrawable(attrs .getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableTop", 0)), bottom = getGifOrDefaultDrawable(attrs .getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableBottom", 0)), start = getGifOrDefaultDrawable(attrs .getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableStart", 0)), end = getGifOrDefaultDrawable(attrs .getAttributeResourceValue(GifImageView.ANDROID_NS, "drawableEnd", 0)); setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom); } setBackgroundInternal(getGifOrDefaultDrawable( attrs.getAttributeResourceValue(GifImageView.ANDROID_NS, "background", 0))); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) // setBackground @SuppressWarnings("deprecation") // setBackgroundDrawable private void setBackgroundInternal(Drawable bg) { if (Build.VERSION.SDK_INT >= 16) { setBackground(bg); } else { setBackgroundDrawable(bg); } } @Override public void setBackgroundResource(int resid) { setBackgroundInternal(getGifOrDefaultDrawable(resid)); } private Drawable getGifOrDefaultDrawable(int resId) { if (resId == 0) { return null; } final Resources resources = getResources(); if (!isInEditMode() && "drawable".equals(resources.getResourceTypeName(resId))) { try { return new GifDrawable(resources, resId); } catch (IOException ignored) { // ignored } catch (NotFoundException ignored) { //ignored } } return resources.getDrawable(resId); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override public void setCompoundDrawablesRelativeWithIntrinsicBounds(int start, int top, int end, int bottom) { setCompoundDrawablesRelativeWithIntrinsicBounds(getGifOrDefaultDrawable(start), getGifOrDefaultDrawable(top), getGifOrDefaultDrawable(end), getGifOrDefaultDrawable(bottom)); } @Override public void setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) { setCompoundDrawablesWithIntrinsicBounds(getGifOrDefaultDrawable(left), getGifOrDefaultDrawable(top), getGifOrDefaultDrawable(right), getGifOrDefaultDrawable(bottom)); } }