AsyncDrawable,异步图片。
源码:
/**
* Author: wyouflf
* Date: 13-11-17
* Time: 上午11:42
*/
public final class AsyncDrawable extends Drawable {
private final WeakReference<ImageLoader> imageLoaderReference;
private Drawable baseDrawable;//对原图片的包装
public AsyncDrawable(ImageLoader imageLoader, Drawable drawable) {
if (imageLoader == null) {
throw new IllegalArgumentException("imageLoader may not be null");
}
baseDrawable = drawable;
while (baseDrawable instanceof AsyncDrawable) {
baseDrawable = ((AsyncDrawable) baseDrawable).baseDrawable;
}
imageLoaderReference = new WeakReference<ImageLoader>(imageLoader);
}
public ImageLoader getImageLoader() {
return imageLoaderReference.get();
}
public void setBaseDrawable(Drawable baseDrawable) {
this.baseDrawable = baseDrawable;
}
public Drawable getBaseDrawable() {
return baseDrawable;
}
//以下几个函数作为对Drawable的包装,要调用被包装对象的方法实现
@Override
public void draw(Canvas canvas) {
if (baseDrawable != null) {
baseDrawable.draw(canvas);
}
}
@Override
public void setAlpha(int i) {
if (baseDrawable != null) {
baseDrawable.setAlpha(i);
}
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
if (baseDrawable != null) {
baseDrawable.setColorFilter(colorFilter);
}
}
@Override
public int getOpacity() {
return baseDrawable == null ? PixelFormat.TRANSLUCENT : baseDrawable.getOpacity();
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
if (baseDrawable != null) {
baseDrawable.setBounds(left, top, right, bottom);
}
}
@Override
public void setBounds(Rect bounds) {
if (baseDrawable != null) {
baseDrawable.setBounds(bounds);
}
}
@Override
public void setChangingConfigurations(int configs) {
if (baseDrawable != null) {
baseDrawable.setChangingConfigurations(configs);
}
}
@Override
public int getChangingConfigurations() {
return baseDrawable == null ? 0 : baseDrawable.getChangingConfigurations();
}
@Override
public void setDither(boolean dither) {
if (baseDrawable != null) {
baseDrawable.setDither(dither);
}
}
@Override
public void setFilterBitmap(boolean filter) {
if (baseDrawable != null) {
baseDrawable.setFilterBitmap(filter);
}
}
@Override
public void invalidateSelf() {
if (baseDrawable != null) {
baseDrawable.invalidateSelf();
}
}
@Override
public void scheduleSelf(Runnable what, long when) {
if (baseDrawable != null) {
baseDrawable.scheduleSelf(what, when);
}
}
@Override
public void unscheduleSelf(Runnable what) {
if (baseDrawable != null) {
baseDrawable.unscheduleSelf(what);
}
}
@Override
public void setColorFilter(int color, PorterDuff.Mode mode) {
if (baseDrawable != null) {
baseDrawable.setColorFilter(color, mode);
}
}
@Override
public void clearColorFilter() {
if (baseDrawable != null) {
baseDrawable.clearColorFilter();
}
}
@Override
public boolean isStateful() {
return baseDrawable != null && baseDrawable.isStateful();
}
@Override
public boolean setState(int[] stateSet) {
return baseDrawable != null && baseDrawable.setState(stateSet);
}
@Override
public int[] getState() {
return baseDrawable == null ? null : baseDrawable.getState();
}
@Override
public Drawable getCurrent() {
return baseDrawable == null ? null : baseDrawable.getCurrent();
}
@Override
public boolean setVisible(boolean visible, boolean restart) {
return baseDrawable != null && baseDrawable.setVisible(visible, restart);
}
@Override
public Region getTransparentRegion() {
return baseDrawable == null ? null : baseDrawable.getTransparentRegion();
}
@Override
public int getIntrinsicWidth() {
return baseDrawable == null ? 0 : baseDrawable.getIntrinsicWidth();
}
@Override
public int getIntrinsicHeight() {
return baseDrawable == null ? 0 : baseDrawable.getIntrinsicHeight();
}
@Override
public int getMinimumWidth() {
return baseDrawable == null ? 0 : baseDrawable.getMinimumWidth();
}
@Override
public int getMinimumHeight() {
return baseDrawable == null ? 0 : baseDrawable.getMinimumHeight();
}
@Override
public boolean getPadding(Rect padding) {
return baseDrawable != null && baseDrawable.getPadding(padding);
}
@Override
public Drawable mutate() {
return baseDrawable == null ? null : baseDrawable.mutate();
}
@Override
public ConstantState getConstantState() {
return baseDrawable == null ? null : baseDrawable.getConstantState();
}
@Override
protected void finalize() throws Throwable {//因为是异步,所以还要停止对应的loader
super.finalize();
ImageLoader imageLoader = this.getImageLoader();
if (imageLoader != null) {
imageLoader.cancel();
}
}
}