2010-12-21 94 views
6

我想知道是否可以在绘制位图后仅将一部分位图加载到内存中而不创建新的位图。我看到Drawable有一个setBounds方法,但我不确定它是否只绘制区域集或调整整个图像的大小。谢谢。仅绘制Drawable/Bitmap的一部分

回答

2

我搜索的答案,正是这个问题,以便能够重新使用现有的位图我的形象缓存和避免内存碎片(以及随后的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; 
    } 
}