仅绘制Drawable / Bitmap的一部分

时间:2010-12-21 21:23:36

标签: android bitmap drawable surfaceview

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

2 个答案:

答案 0 :(得分:9)

假设您有一个要绘制的主画布,您可以使用Canvas类的drawBitmap方法之一来绘制已加载位图的子集。

public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)

答案 1 :(得分:3)

我搜索了这个问题的答案,以便能够为我的图像缓存重用现有的位图,并避免内存碎片(以及后续的OutOfMemoryError ...),这是由于在不同的部分分配了大量的位图引起的一个记忆空间。 因此,我创建了简单的专用“BitmapSubsetDrawable”,它将自身公开为带下划线的Bitmap的任意部分(该部分由scrRect确定)。 现在我分配一组足够大的Bitmaps,然后重用它们(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;
    }
}