【问题标题】:draw only a portion of a Drawable/Bitmap仅绘制 Drawable/Bitmap 的一部分
【发布时间】:2011-05-29 02:09:06
【问题描述】:

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

【问题讨论】:

    标签: android bitmap drawable surfaceview


    【解决方案1】:

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

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

    【讨论】:

    • 这将调整整个位图的大小以适应目标矩形。
    • 只有将源矩形定义为与整个源位图大小相同或为空时才会出现这种情况。定义一个较小的矩形将获取一个子集。从手册页“如果源矩形不为空,它指定要绘制的位图子集”
    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多