3

2014 年 10 月,杰克·沃顿 (Jake Wharton) 写了《强迫毕加索玩调色板》。其中,有两种方法正在思考:

  1. 使用生成调色板的转换。这样做的好处是调色板是在 Picasso 的工作线程上生成的,并且在加载图像时就准备好了。然而,缺点似乎是我得到的调色板与图片不匹配。目前我一次只运行其中一个转换。

  2. 使用CallbackonSuccess获取位图ImageView并生成调色板。我情不自禁地把注意力集中在// 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;
    }
}
4

2 回答 2

9

根据杰克沃顿的说法,目前还没有好的方法

我最终做的是使用 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);
                        }
                    });

剩下的唯一问题是我知道阁楼里藏着丑陋的东西,现在这必须是我肮脏的小秘密。

于 2015-02-24T21:20:27.267 回答
-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);
于 2015-02-24T20:51:20.640 回答