2016-04-15 2 views
2

У меня есть файлы изображений (png/jpg). При загрузке в listview некоторые из них мне нужно наложить на другое прозрачное изображение. Я делаю это с помощью что-то вроде следующего:Файл с картинкой с картинкой с плавающей запятой Android применяется наложение и устанавливается в изображение.

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; 
    } 

где BitmapUtils является пользовательский класс, который реализует битовые-накрест методы.

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); 
    } 
} 



Использование универсального загрузчика Изображение библиотеки для Android (ИЮОЖ), этот эффект достигается путем написания пользовательских ImageDecoder и применить его к ImageLoaderConfiguration.

Вопрос в том, как я могу это сделать с помощью Glide?
Спасибо.

ответ

2

То, что работает для меня:
Я использовал следующий ответ: 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){} 
    } 



Таким образом, чтобы загрузить растровое изображение и взаимодействовать с ним перед показом пользователю, вы необходимо реализовать пользовательскую цель и взаимодействовать там. Класс SimpleTarget, предоставляемый Glide, реализует интерфейс Target и позволяет такие вещи. Для получения дополнительной информации вы можете посетить страницу вики-страницы Glide's CustomTargets на github: https://github.com/bumptech/glide/wiki/Custom-targets

+0

Где я могу найти класс BitmapUtils? – AndroidRuntimeException

+0

@ AgustinSivoplás Это не класс библиотеки, я создал его специально для этого проекта, чтобы удержать базовые растровые методы. –

+0

Я создал публичный смысл, если кому-то нужен класс BitmapUtils.java в будущем. https://gist.github.com/agustinsivoplas/44f01672d698394dc28edda2c7a05cb6 – AndroidRuntimeException

Смежные вопросы