Add LoaderImageView
This commit is contained in:
parent
deb27204cb
commit
a5f6f4ff30
156
src/com/blundell/tut/LoaderImageView.java
Normal file
156
src/com/blundell/tut/LoaderImageView.java
Normal file
@ -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");
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user