2016-03-14 4 views
1

Я использую палитра-v7: 23.2.1 с скольжением: 3.7.0, как указано ниже, но иногда темный яркий цвет не успешно извлечен, и вместо этого я получаю цвет по умолчанию.Palette использования с Glide иногда не загружать темные яркие цвета

После того, как я очистил кэш глиссада и попробую его с тем же изображением снова, я получаю правильный цвет. Странно, что светлый яркий цвет всегда извлекается, а темный - нет.

В чем может быть проблема и как ее решить?


В onCreateView():

Glide.with(mContext) 
    .load(artworkUrl) 
    .asBitmap() 
    .into(new BitmapImageViewTarget(mArtworkInToolbar) { 
     @Override 
     public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { 
      new Palette.Builder(bitmap).generate(paletteAsyncListener); 
      super.onResourceReady(bitmap, anim); 
     } 
    }); 

СЛУШАТЕЛЬ:

public final Palette.PaletteAsyncListener paletteAsyncListener = 
    new Palette.PaletteAsyncListener() { 

    @Override 
    public void onGenerated(Palette palette) { 
     if (palette == null) return; 

     int default = ContextCompat.getColor(mContext, R.color.colorPrimary); 
     int color = palette.getVibrantColor(default); //always ok 
     int colorDark = palette.getDarkVibrantColor(default); //not always 

     // --- Setting the color -- 
    } 
}; 
+0

https://github.com/bumptech/glide/wiki/Custom-targets#overriding- default-behavior эта ссылка дает причину этой проблемы и решения – redblood

+0

Первое решение, которое я использовал, не рекомендуется, так как второй асинхронный вызов может обновить wr ong ViewHolder, но это не мое дело. Я также попробовал второй пример, но иногда он не будет извлекать второй цвет или сначала в том же сценарии и том же изображении. – Niorko

ответ

1
***Here this is worked for me*** 
make a class name PaletteBitmap.java 

public class PaletteBitmap { 
    public final Palette palette; 
    public final Bitmap bitmap; 

    public PaletteBitmap(@NonNull Bitmap bitmap, @NonNull Palette palette) { 
     this.bitmap = bitmap; 
     this.palette = palette; 
    } 
    Bitmap getBitmap() 
    { 
     return bitmap; 
    } 
} 
class PaletteBitmapResource implements Resource<PaletteBitmap> { 
    private final PaletteBitmap paletteBitmap; 
    private final BitmapPool bitmapPool; 

    public PaletteBitmapResource(@NonNull PaletteBitmap paletteBitmap, @NonNull BitmapPool bitmapPool) { 
     this.paletteBitmap = paletteBitmap; 
     this.bitmapPool = bitmapPool; 
    } 

    @Override public PaletteBitmap get() { 
     return paletteBitmap; 
    } 

    @Override public int getSize() { 
     return Util.getBitmapByteSize(paletteBitmap.bitmap); 
    } 

    @Override public void recycle() { 
     if (!bitmapPool.put(paletteBitmap.bitmap)) { 
      paletteBitmap.bitmap.recycle(); 
     } 
    } 
} 
class PaletteBitmapTranscoder implements ResourceTranscoder<Bitmap, PaletteBitmap> { 
    private final BitmapPool bitmapPool; 

    public PaletteBitmapTranscoder(@NonNull Context context) { 
     this.bitmapPool = Glide.get(context).getBitmapPool(); 
    } 

    @Override public Resource<PaletteBitmap> transcode(Resource<Bitmap> toTranscode) { 
     Bitmap bitmap = toTranscode.get(); 
     Palette palette = new Palette.Builder(bitmap).generate(); 
     PaletteBitmap result = new PaletteBitmap(bitmap, palette); 
     return new PaletteBitmapResource(result, bitmapPool); 
    } 

    @Override public String getId() { 
     return PaletteBitmapTranscoder.class.getName(); 
    } 
} 


**Now in Your onCreateView() do like this** 
Glide.with(this).fromUri().asBitmap() 
       .transcode(new PaletteBitmapTranscoder(this),PaletteBitmap.class) 
       .fitCenter()load(uri).into(new ImageViewTarget<PaletteBitmap>(imageView){ 

     @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
     @Override 
     protected void setResource(PaletteBitmap resource) { 
      imageView.setImageBitmap(resource.getBitmap()); 
      int colorP = resource.palette.getMutedColor(ContextCompat.getColor(context, R.color.colorPrimary)); 
     int colorD=resource.palette.getDarkMutedColor(ContextCompat.getColor(context,R.color .colorPrimaryDark)); 
      // dowhatever you want 
     } 
    });; 
+0

В основном такое же решение, как [link] (https://github.com/florent37/GlidePalette). Я тоже пробовал. Я знаю, что извлечение может завершиться неудачей с помощью снимков certains, но иногда это сбой с той же картинкой. Вот в чем вопрос. Но спасибо за полное решение. – Niorko