рисовать только часть Drawable / Bitmap - PullRequest
6 голосов
/ 22 декабря 2010

Мне было интересно, можно ли нарисовать только часть растрового изображения после его загрузки в память без создания нового растрового изображения. Я вижу, что Drawable имеет метод setBounds, но я не уверен, что он только рисует установленную область или просто изменяет размер всего изображения. Спасибо.

Ответы [ 2 ]

9 голосов
/ 22 декабря 2010

Предполагая, что у вас есть основной холст для рисования, вы можете использовать один из методов drawBitmap класса Canvas для рисования подмножества загруженного растрового изображения.

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

3 голосов
/ 09 апреля 2016

Я искал ответ именно на этот вопрос, чтобы иметь возможность повторно использовать существующие растровые изображения для моего кэша изображений и избежать фрагментации памяти (и последующего 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;
    }
}
...