package in.srain.cube.image.impl; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.util.Log; import android.view.ViewGroup; import in.srain.cube.image.CubeImageView; import in.srain.cube.image.ImageTask; import in.srain.cube.image.drawable.RoundedDrawable; import in.srain.cube.image.iface.ImageLoadHandler; import in.srain.cube.util.Debug; import in.srain.cube.util.Version; /** * A simple implementation of {@link ImageLoadHandler}. * <p/> * This loader will put a background to ImageView when the image is loading. * * @author http://www.liaohuqiu.net */ public class DefaultImageLoadHandler implements ImageLoadHandler { private final static boolean DEBUG = Debug.DEBUG_IMAGE; private final static String Log_TAG = "cube_image"; private final static String MSG_LOADING = "%s onLoading"; private final static String MSG_LOAD_ERROR = "%s load error"; private final static String MSG_LOAD_FINISH = "%s onLoadFinish %s %s %s %s"; private Context mContext; private final static int DISPLAY_FADE_IN = 0x01; private final static int DISPLAY_ROUNDED = 0x02; private int mDisplayTag = DISPLAY_FADE_IN; private Drawable mLoadingDrawable; private Drawable mErrorDrawable; private int mLoadingColor = -1; private float mCornerRadius = 10; private boolean mResizeImageViewAfterLoad = false; public DefaultImageLoadHandler(Context context) { mContext = context; if (Version.hasHoneycomb()) { int color = Color.parseColor("#fafafa"); mLoadingDrawable = new ColorDrawable(color); } } /** * If set to true, the image will fade-in once it has been loaded by the background thread. */ public void setImageFadeIn(boolean fadeIn) { if (fadeIn) { mDisplayTag |= DISPLAY_FADE_IN; } else { mDisplayTag &= ~DISPLAY_FADE_IN; } } /** * */ public void setImageRounded(boolean rounded, float cornerRadius) { if (rounded) { mDisplayTag |= DISPLAY_ROUNDED; mCornerRadius = cornerRadius; } else { mDisplayTag &= ~DISPLAY_ROUNDED; } } public void setResizeImageViewAfterLoad(boolean resize) { mResizeImageViewAfterLoad = resize; } /** * set the placeholder bitmap */ public void setLoadingBitmap(Bitmap loadingBitmap) { if (Version.hasHoneycomb()) { mLoadingDrawable = new BitmapDrawable(mContext.getResources(), loadingBitmap); } } /** * set the placeholder Image * * @param loadingBitmap the resources id */ public void setLoadingResources(int loadingBitmap) { setLoadingBitmap(BitmapFactory.decodeResource(mContext.getResources(), loadingBitmap)); } public void setErrorBitmap(Bitmap bitmap) { if (Version.hasHoneycomb()) { mErrorDrawable = new BitmapDrawable(mContext.getResources(), bitmap); } } /** * set the error Image * * @param resId */ public void setErrorResources(int resId) { setErrorBitmap(BitmapFactory.decodeResource(mContext.getResources(), resId)); } /** * set the placeholder by color * * @param color */ public void setLoadingImageColor(int color) { mLoadingColor = color; mLoadingDrawable = new ColorDrawable(color); } /** * set the placeholder image by color string like: #ffffff * * @param colorString */ public void setLoadingImageColor(String colorString) { setLoadingImageColor(Color.parseColor(colorString)); } @Override public void onLoading(ImageTask imageTask, CubeImageView imageView) { if (DEBUG) { Log.d(Log_TAG, String.format(MSG_LOADING, imageTask)); } if (Version.hasHoneycomb()) { if (mLoadingDrawable != null && imageView != null && imageView.getDrawable() != mLoadingDrawable) { imageView.setImageDrawable(mLoadingDrawable); } } else { imageView.setImageDrawable(null); } } @Override public void onLoadError(CubeImageView imageView, ImageTask imageTask) { if (DEBUG) { Log.d(Log_TAG, String.format(MSG_LOAD_ERROR, imageTask)); } if (Version.hasHoneycomb()) { if (mErrorDrawable != null && imageView != null && imageView.getDrawable() != mErrorDrawable) { imageView.setImageDrawable(mErrorDrawable); } } else { imageView.setImageDrawable(null); } } @Override public void onLoadFinish(ImageTask imageTask, CubeImageView imageView, BitmapDrawable drawable) { Drawable d = drawable; if (drawable != null) { if (mResizeImageViewAfterLoad) { int w = drawable.getBitmap().getWidth(); int h = drawable.getBitmap().getHeight(); if (w > 0 && h > 0) { ViewGroup.LayoutParams lyp = imageView.getLayoutParams(); if (lyp != null) { lyp.width = w; lyp.height = h; imageView.setLayoutParams(lyp); } } } // RoundedDrawable will not recycle automatically when API level is lower than 11 if ((mDisplayTag & DISPLAY_ROUNDED) == DISPLAY_ROUNDED && Version.hasHoneycomb()) { d = new RoundedDrawable(drawable.getBitmap(), mCornerRadius, 0); } if ((mDisplayTag & DISPLAY_FADE_IN) == DISPLAY_FADE_IN) { int loadingColor = android.R.color.transparent; if (mLoadingColor != -1) { loadingColor = mLoadingColor; } final TransitionDrawable td = new TransitionDrawable(new Drawable[]{new ColorDrawable(loadingColor), d}); imageView.setImageDrawable(td); td.startTransition(200); } else { if (DEBUG) { Drawable oldDrawable = imageView.getDrawable(); int w = 0, h = 0; if (oldDrawable != null) { w = oldDrawable.getIntrinsicWidth(); h = oldDrawable.getIntrinsicHeight(); } Log.d(Log_TAG, String.format(MSG_LOAD_FINISH, imageTask, w, h, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight())); } imageView.setImageDrawable(drawable); } } } }