我正在使用Glide调整图像大小并将其保存到安卓应用程序的文件系统中,我还创建了一个自定义的FileTarget
类,该类扩展了Glide的原生Target
来完成此操作。
它起作用了。耶!但我对我不得不“定义”的所有空方法感到有点震惊,以使其满足Target
实现。我真正关心的是onResourceReady
..。
有没有办法在不声明所有这些空方法的情况下实现这一点?我应该担心他们都是这样的吗?
我是Android的新手,所以我很感谢您的耐心。
public static class FileTarget<T extends Bitmap> implements Target<Bitmap> {
private final int width;
private final int height;
String fileName;
Bitmap.CompressFormat format;
int quality;
public FileTarget(int width, int height, String fileName, Bitmap.CompressFormat format, int quality) {
this.width = width;
this.height = height;
this.fileName = fileName;
this.format = format;
this.quality = quality;
}
@Override
public void onLoadStarted(Drawable drawable) {}
@Override
public void onLoadFailed(Drawable drawable) {}
@Override
public void onLoadCleared(Drawable drawable) {}
@Override
public void getSize(SizeReadyCallback cb) {
cb.onSizeReady(width, height);
}
@Override
public void removeCallback(@NonNull SizeReadyCallback cb) {}
@Override
public void setRequest(@Nullable Request request) {}
@Nullable
@Override
public Request getRequest() {
return null;
}
@Override
public void onStart() {}
@Override
public void onStop() {}
@Override
public void onDestroy() {}
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
try {
FileOutputStream out = new FileOutputStream(fileName);
resource.compress(format, quality, out);
out.flush();
out.close();
onFileSaved();
} catch (IOException e) {
e.printStackTrace();
onSaveException(e);
}
}
public void onFileSaved() {
// do nothing, should be overriden
}
public void onSaveException(Exception e) {
// do nothing, should be overriden
}
}
发布于 2019-06-11 05:41:57
在Android框架中,有一种常见的模式,即创建一个抽象的FooAdapter
类,该类在一个Foo
接口中实现所有的方法,而不使用任何操作。
例如,考虑这个类:
public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener,
Animator.AnimatorPauseListener {
@Override
public void onAnimationCancel(Animator animation) { }
@Override
public void onAnimationEnd(Animator animation) { }
@Override
public void onAnimationRepeat(Animator animation) { }
@Override
public void onAnimationStart(Animator animation) { }
@Override
public void onAnimationPause(Animator animation) { }
@Override
public void onAnimationResume(Animator animation) { }
}
你可以为Glide创建同样的东西:
public abstract class TargetAdapter<T> implements Target<T> {
@Override
public void onLoadStarted(Drawable drawable) {}
@Override
public void onLoadFailed(Drawable drawable) {}
@Override
public void onLoadCleared(Drawable drawable) {}
@Override
public void getSize(SizeReadyCallback cb) {}
@Override
public void removeCallback(@NonNull SizeReadyCallback cb) {}
@Override
public void setRequest(@Nullable Request request) {}
@Override
public Request getRequest() {}
@Override
public void onResourceReady(@NonNull T resource, @Nullable Transition<? super T> transition) {}
}
现在,当您创建FileTarget
类时,您可以将其声明为extends TargetAdapter
而不是implements Target
,并且只覆盖您关心的方法:
public static class FileTarget<T extends Bitmap> extends TargetAdapter<Bitmap> {
// ...
@Override
public void getSize(SizeReadyCallback cb) {
cb.onSizeReady(width, height);
}
@Nullable
@Override
public Request getRequest() {
return null;
}
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
try {
FileOutputStream out = new FileOutputStream(fileName);
resource.compress(format, quality, out);
out.flush();
out.close();
onFileSaved();
} catch (IOException e) {
e.printStackTrace();
onSaveException(e);
}
}
// ...
}
https://stackoverflow.com/questions/56533782
复制相似问题