Я искал ответ именно на этот вопрос, чтобы иметь возможность повторно использовать существующие растровые изображения для моего кэша изображений и избежать фрагментации памяти (и последующего OutOfMemoryError ...), которая была вызвана большим количеством растровых изображений, размещенных в разных частяхпространства памяти.В результате я создал простой специализированный «BitmapSubsetDrawable», который представляет собой произвольную часть подчеркнутого растрового изображения (эта часть определяется scrRect).Теперь я выделяю набор достаточно больших растровых изображений один раз, а затем повторно использую их (canvas.drawBitmap (sourceBitmap, 0, 0, null); для них ...) для хранения различных растровых изображений.
Основной кодкласса ниже, см. BitmapSubsetDrawable.java для фактического использования.
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
public class BitmapSubsetDrawable extends Drawable {
private Bitmap bitmap;
private Rect scrRect;
public BitmapSubsetDrawable(@NonNull Bitmap bitmap, @NonNull Rect srcRect) {
this.bitmap = bitmap;
this.scrRect = srcRect;
}
@Override
public int getIntrinsicWidth() {
return scrRect.width();
}
@Override
public int getIntrinsicHeight() {
return scrRect.height();
}
@Override
public void draw(Canvas canvas) {
canvas.drawBitmap(bitmap, scrRect, getBounds(), null);
}
@Override
public void setAlpha(int alpha) {
// Empty
}
@Override
public void setColorFilter(ColorFilter cf) {
// Empty
}
@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}
public Bitmap getBitmap() {
return bitmap;
}
}