Я получаю изображения с помощью Picasso и запускаю их через Transformation. Странно, что, хотя объект Transformation создан для каждого изображения, преобразование метода вызывается только один раз.Picasso только вызывает преобразование один раз
Я создаю несколько следующих объектов (проанализированных с помощью Gson), а затем вызывается на них «postDeserialise».
@Hide
transient public ObservableField<Drawable> badgeImage;
@Hide
transient private ImageUtils.ImageTarget bindableFieldTarget;
public void postDeserialise(Context context, String src){
if (imageURL != null) {
badgeImage = new ObservableField<Drawable>();
bindableFieldTarget = new ImageUtils.ImageTarget(badgeImage, context.getResources());
if (progress.compareTo(BigDecimal.ONE)==0) {
Picasso.with(context)
.load(imageURL)
.into(bindableFieldTarget);
}
else {
GrayscaleTransformation transform = new GrayscaleTransformation(Picasso.with(context), progress);
Picasso.with(context)
.load(imageURL)
.transform(transform)
.into(bindableFieldTarget);
}
}
}
Ниже класс GrayscaleTransformation:
private static final String TAG = "GrayscaleTransformation";
private final Picasso picasso;
private BigDecimal percentageToTransform;
public GrayscaleTransformation(Picasso picasso, BigDecimal percentageToTransform) {
this.picasso = picasso;
this.percentageToTransform = percentageToTransform;
Log.d(TAG, "New GrayscaleTransformation percentageToTransform = " + percentageToTransform);
}
@Override public Bitmap transform(Bitmap source) {
Log.d(TAG, "transform ....");
Bitmap result = createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
Bitmap noise;
try {
noise = picasso.load(R.drawable.noise).get();
} catch (IOException e) {
throw new RuntimeException("Failed to apply transformation! Missing resource.");
}
BitmapShader shader = new BitmapShader(noise, REPEAT, REPEAT);
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
Paint paint = new Paint(ANTI_ALIAS_FLAG);
paint.setColorFilter(filter);
Canvas canvas = new Canvas(result);
int width = canvas.getWidth();
int clipPoint = percentageToTransform.multiply(new BigDecimal(width)).intValue();
Log.d(TAG, "width/clipPoint = " + width + "/" + clipPoint);
canvas.clipRect(clipPoint, 0, canvas.getWidth(), canvas.getHeight(), Region.Op.REPLACE);
canvas.drawBitmap(source, 0, 0, paint);
paint.setColorFilter(null);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
canvas.drawRect(0, 0, width, canvas.getHeight(), paint);
canvas.clipRect(0, 0, clipPoint, canvas.getHeight(), Region.Op.REPLACE);
canvas.drawBitmap(source, 0, 0, new Paint());
source.recycle();
noise.recycle();
return result;
}
@Override public String key() {
return "grayscaleTransformation()";
}
И «мишень»
public static class ImageTarget implements Target {
private ObservableField<Drawable> observableField;
private Resources resources;
public ImageTarget(ObservableField<Drawable> observableField, Resources resources) {
this.observableField = observableField;
this.resources = resources;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
observableField.set(new BitmapDrawable(resources, bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
observableField.set(errorDrawable);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
observableField.set(placeHolderDrawable);
}
}
Класс преобразования определенно создается каждый раз, когда я вижу его в журнале но метод transform вызывается только один раз.