2014年10月,杰克沃顿写了Coercing Picasso to Play With Palette。在其中,有两种方法在思考:
使用转换生成调色板。这样做的好处是,调色板是在Picasso的工作线程上生成的,并且在加载图像时就绪。然而,缺点似乎是我得到了与图片不匹配的调色板。目前我一次只运行其中一个转换。
使用Callback
onSuccess
从ImageView
获取位图并生成调色板。我不禁专注于Jake在这一行末尾提出的// Ew!
,我完全赞同。
上面提到的帖子是在2014年10月写的。现在我们已经过了几个月的讨论,我想知道推荐的方法是什么?
还讨论了将meta data
与位图相关联的问题。这是实施的吗?我该如何使用它?
我的Transformation
代码(不是最终代码,我刚开始研究这个代码):
public final class PaletteGenerator
implements Transformation {
private final int numColors;
@Getter private Palette palette;
@Override public Bitmap transform (final Bitmap source) {
palette = null;
final Palette palette = numColors > 0
? Palette.generate (source, numColors)
: Palette.generate (source);
return source;
}
@Override public String key () {
return String.format (Locale.ENGLISH, "%s:%d", getClass ().getCanonicalName (), numColors);
}
public PaletteGenerator () {
this (0);
}
public PaletteGenerator (final int c) {
numColors = c;
}
}
答案 0 :(得分:9)
根据Jake Wharton 的说法,还没有好办法
我最终做的是我使用了Transformation方法,并将丑陋的代码封装在一起。隐藏在阁楼里。
public final class PaletteGeneratorTransformation
implements Transformation {
private static final Map<Bitmap, Palette> CACHE = new WeakHashMap<> ();
private final int numColors;
@Override public Bitmap transform (final Bitmap source) {
if (!CACHE.containsKey (source)) {
final Palette palette = numColors > 0
? Palette.generate (source, numColors)
: Palette.generate (source);
CACHE.put (source, palette);
}
return source;
}
@Override public String key () {
return getClass ().getCanonicalName () + ":" + numColors;
}
public PaletteGeneratorTransformation () {
this (0);
}
public PaletteGeneratorTransformation (final int c) {
numColors = c;
}
public static abstract class Callback
implements com.squareup.picasso.Callback {
private final ImageView target;
public Callback (final ImageView t) {
target = t;
}
@Override public void onSuccess () {
onPalette (CACHE.get (((BitmapDrawable) target.getDrawable ()).getBitmap ()));
}
@Override public void onError () {
onPalette (null);
}
public abstract void onPalette (final Palette palette);
}
}
在我的活动中,我按照这些方针做了一些事情:
Picasso.with(context)
.load (getPhotoUri())
.transform (new PaletteGeneratorTransformation (DEFAULT_NUM_COLORS))
.into (photo, new PaletteGeneratorTransformation.Callback (photo) {
@Override public void onPalette (final Palette palette) {
themeWithPalette (palette);
}
});
剩下的唯一问题是,我知道阁楼里隐藏着丑陋的东西,现在这仍然是我肮脏的小秘密。
答案 1 :(得分:-1)
Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
viewHolder.mItemImage.setImageBitmap(bitmap);
Drawable image = viewHolder.mItemImage.getDrawable();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
};
Picasso.with(viewHolder.mItemImage.getContext()).load("url").into(viewHolder.mItemImage);