From a5f6f4ff3096554ac6704f29c9dbd6ffe081898a Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 15 Jun 2014 17:23:46 +0300 Subject: [PATCH] Add LoaderImageView --- src/com/blundell/tut/LoaderImageView.java | 156 ++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/com/blundell/tut/LoaderImageView.java diff --git a/src/com/blundell/tut/LoaderImageView.java b/src/com/blundell/tut/LoaderImageView.java new file mode 100644 index 0000000..323366b --- /dev/null +++ b/src/com/blundell/tut/LoaderImageView.java @@ -0,0 +1,156 @@ +package com.blundell.tut; + +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.os.Handler.Callback; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; + +/** + * Free for anyone to use, just say thanks and share :-) + * @author Blundell + */ +public class LoaderImageView extends LinearLayout { + + private static final int COMPLETE = 0; + private static final int FAILED = 1; + + private Context mContext; + private Drawable mDrawable; + private ProgressBar mSpinner; + private ImageView mImage; + + /** + * This is used when creating the view in XML + * To have an image load in XML use the tag 'image="http://developer.android.com/images/dialog_buttons.png"' + * Replacing the url with your desired image + * Once you have instantiated the XML view you can call + * setImageDrawable(url) to change the image + * @param context + * @param attrSet + */ + public LoaderImageView(final Context context, final AttributeSet attrSet) { + super(context, attrSet); + final String url = attrSet.getAttributeValue(null, "image"); + if (url != null) { + instantiate(context, url); + } else { + instantiate(context, null); + } + } + + /** + * This is used when creating the view programatically + * Once you have instantiated the view you can call + * setImageDrawable(url) to change the image + * @param context the Activity context + * @param imageUrl the Image URL you wish to load + */ + public LoaderImageView(final Context context, final String imageUrl) { + super(context); + instantiate(context, imageUrl); + } + + /** + * This is used when creating the view programatically + * Once you have instantiated the view you can call + * setImageDrawable(url) to change the image + * @param context the Activity context + * @param imageUrl the Image URL you wish to load + */ + public LoaderImageView(final Context context) { + super(context); + instantiate(context, null); + } + + /** + * First time loading of the LoaderImageView + * Sets up the LayoutParams of the view, you can change these to + * get the required effects you want + */ + private void instantiate(final Context context, final String imageUrl) { + mContext = context; + + mImage = new ImageView(mContext); + mImage.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + + mSpinner = new ProgressBar(mContext); + mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + + mSpinner.setIndeterminate(true); + + addView(mSpinner); + addView(mImage); + + if (imageUrl != null) { + setImageDrawable(imageUrl); + } + } + + /** + * Set's the view's drawable, this uses the internet to retrieve the image + * don't forget to add the correct permissions to your manifest + * @param imageUrl the url of the image you wish to load + */ + public void setImageDrawable(final String imageUrl) { + mDrawable = null; + mSpinner.setVisibility(View.VISIBLE); + mImage.setVisibility(View.GONE); + new Thread() { + @Override + public void run() { + try { + mDrawable = getDrawableFromUrl(imageUrl); + imageLoadedHandler.sendEmptyMessage(COMPLETE); + } catch (MalformedURLException e) { + imageLoadedHandler.sendEmptyMessage(FAILED); + } catch (IOException e) { + imageLoadedHandler.sendEmptyMessage(FAILED); + } + }; + }.start(); + } + + /** + * Callback that is received once the image has been downloaded + */ + private final Handler imageLoadedHandler = new Handler(new Callback() { + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case COMPLETE: + mImage.setImageDrawable(mDrawable); + mImage.setVisibility(View.VISIBLE); + mSpinner.setVisibility(View.GONE); + break; + case FAILED: + default: + // Could change image here to a 'failed' image + // otherwise will just keep on spinning + break; + } + return true; + } + }); + + /** + * Pass in an image url to get a drawable object + * @return a drawable object + * @throws IOException + * @throws MalformedURLException + */ + private static Drawable getDrawableFromUrl(final String url) throws IOException, MalformedURLException { + return Drawable.createFromStream(((InputStream) new URL(url).getContent()), "name"); + } + +}