6

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

4

2 回答 2

10

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

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

于 2010-12-22T03:16:24.030 回答
3

我搜索了这个问题的答案,以便能够为我的图像缓存重用现有位图并避免内存碎片(以及随后的 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;
    }
}
于 2016-04-09T11:49:05.207 回答