2016-04-15 7 views
2

Ich habe Bilddateien (PNG/JPG). Beim Laden in die Listenansicht müssen einige von ihnen mit einem anderen transparenten Bild überlagert werden. Ich mache das mit so etwas wie folgt aus:Android Glide Bilddatei laden Überlagerung anwenden und auf Bildansicht setzen

public Bitmap applyOverlay(Context context, Bitmap sourceImage, int overlayDrawableResourceId){ 
     Bitmap bitmap = null; 
     try{ 
      int width = sourceImage.getWidth(); 
      int height = sourceImage.getHeight(); 
      Resources r = context.getResources(); 
      Drawable imageAsDrawable = new BitmapDrawable(r, sourceImage); 
      Drawable[] layers = new Drawable[2]; 
      layers[0] = imageAsDrawable; 
      layers[1] = new BitmapDrawable(r, BitmapUtils.decodeSampledBitmapFromResource(r, overlayDrawableResourceId, width, height)); 
      LayerDrawable layerDrawable = new LayerDrawable(layers);    
      bitmap = BitmapUtils.drawableToBitmap(layerDrawable); 
     }catch (Exception ex){} 
     return bitmap; 
    } 

wo BitmapUtils eine benutzerdefinierte Klasse, die Bitmap-weise Methoden implementiert.

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.graphics.drawable.LayerDrawable; 
import android.media.ThumbnailUtils; 
import android.widget.ImageView; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 

public class BitmapUtils { 

    public static Bitmap applyOverlay(Context context, Bitmap sourceImage, int overlayDrawableResourceId){ 
     Bitmap bitmap = null; 
     try{ 
      int width = sourceImage.getWidth(); 
      int height = sourceImage.getHeight(); 
      Resources r = context.getResources(); 
      Drawable imageAsDrawable = new BitmapDrawable(r, sourceImage); 
      Drawable[] layers = new Drawable[2]; 
      layers[0] = imageAsDrawable; 
      layers[1] = new BitmapDrawable(r, BitmapUtils.decodeSampledBitmapFromResource(r, overlayDrawableResourceId, width, height)); 
      LayerDrawable layerDrawable = new LayerDrawable(layers); 
      bitmap = BitmapUtils.drawableToBitmap(layerDrawable); 
     }catch (Exception ex){} 
     return bitmap; 
    } 

    public static Bitmap drawableToBitmap(Drawable drawable) { 
     Bitmap bitmap = null; 

     if (drawable instanceof BitmapDrawable) { 
      BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
      if(bitmapDrawable.getBitmap() != null) { 
       return bitmapDrawable.getBitmap(); 
      } 
     } 

     if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { 
      bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel 
     } else { 
      bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
     } 

     Canvas canvas = new Canvas(bitmap); 
     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
     drawable.draw(canvas); 
     return bitmap; 
    } 

    static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){ 
     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeResource(res, resId, options); 

     // Compute inSampleSize 
     options.inSampleSize = computeInSampleSize(options, reqWidth, reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(res, resId, options); 
    } 
} 



Mit Universal-Image Loader-Bibliothek für Android (UIL) wird dieser Effekt erreicht, indem einen benutzerdefinierten ImageDecoder zu schreiben und es auf den ImageLoaderConfiguration Anwendung.

Die Frage ist, wie kann ich das mit Glide tun?
Danke.

Antwort

2

Die Sache, die für mich gearbeitet:
ich folgende Antwort verwendet: https://stackoverflow.com/a/33709650/3106975

public void display(final Context context, String mediaPath, final ImageView imageView, final boolean doApplyOverlay){ 
     try{     
       Glide.with(context) 
         .load(mediaPath) 
         .asBitmap() 
         .placeholder(R.drawable.placeholder_default) 
         .error(R.drawable.error_default) 
         .diskCacheStrategy(DiskCacheStrategy.ALL) 
         .into(new SimpleTarget<Bitmap>() { 
          @Override 
          public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
           if (doApplyOverlay) { 
            resource = BitmapUtils.applyOverlay(context, resource, R.drawable.overlay); 
           } 
           imageView.setImageBitmap(resource); 
          } 
         });  
     }catch (Exception ex){} 
    } 



Also, ein Bitmap zu laden und mit ihr zu interagieren, bevor sie den Benutzer, Sie Sie müssen ein benutzerdefiniertes Ziel implementieren und die Interaktionen dort durchführen. Die von Glide zur Verfügung gestellte SimpleTarget-Klasse implementiert das Target-Interface und ermöglicht diese Art von Dingen. Für weitere Informationen, besuchen Sie Glides CustomTargets Wiki-Seite auf github: https://github.com/bumptech/glide/wiki/Custom-targets

+0

Wo finde ich BitmapUtils Klasse? – AndroidRuntimeException

+0

@ AgustinSivoplás Es ist keine Bibliotheksklasse, ich habe es speziell für dieses Projekt erstellt, um die grundlegenden Bitmap-Methoden zu verwenden. –

+0

Ich habe ein öffentliches Gist erstellt, wenn jemand BitmapUtils.java Klasse in der Zukunft braucht. https://gist.github.com/agustinsivoplas/44f01672d698394dc28edda2c7a05cb6 – AndroidRuntimeException