【发布时间】:2011-05-29 02:09:06
【问题描述】:
我想知道是否可以在将位图加载到内存后只绘制它的一部分而不创建新的位图。我看到 Drawable 有一个 setBounds 方法,但我不确定它是只绘制区域集还是只调整整个图像的大小。谢谢。
【问题讨论】:
标签: android bitmap drawable surfaceview
我想知道是否可以在将位图加载到内存后只绘制它的一部分而不创建新的位图。我看到 Drawable 有一个 setBounds 方法,但我不确定它是只绘制区域集还是只调整整个图像的大小。谢谢。
【问题讨论】:
标签: android bitmap drawable surfaceview
假设您有一个要绘制的主画布,您可以使用 Canvas 类的 drawBitmap 方法之一来绘制已加载位图的子集。
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
【讨论】:
我搜索了这个问题的答案,以便能够为我的图像缓存重用现有位图并避免内存碎片(以及随后的 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;
}
}
【讨论】: