2010-12-21 7 views
6

Me preguntaba si es posible dibujar solo una parte de un mapa de bits después de que se carga en la memoria sin crear un nuevo mapa de bits. Veo que Drawable tiene un método setBounds, pero no estoy seguro de si solo dibuja el área configurada o si simplemente cambia el tamaño de la imagen completa. Gracias.dibuja solo una parte de un Drawable/Bitmap

Respuesta

9

Suponiendo que tiene un lienzo principal para dibujar, puede utilizar uno de los métodos drawBitmap de la clase Canvas para dibujar un subconjunto del mapa de bits cargado.

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

+1

que redimensionaría todo el mapa de bits para encajar en el rectángulo de destino. – jfisk

+3

que solo sería el caso si define que el rectángulo de origen tiene el mismo tamaño que el mapa de bits de origen entero o si es nulo. La definición de un rectángulo más pequeño buscaría un subconjunto. De las páginas de manual "Si el rectángulo de origen no es nulo, especifica el subconjunto del mapa de bits para dibujar" –

2

buscaba una respuesta a esta pregunta con exactitud con el fin de ser capaz de volver a utilizar mapas de bits existentes para mi caché de imágenes y para evitar la fragmentación de la memoria (y posterior OutOfMemoryError ...), que fue causado por lotes de mapas de bits asignados en diferentes partes de un espacio de memoria. Como resultado, creé un "BitmapSubsetDrawable" especializado y simple, que se expone como una parte arbitraria del mapa de bits subrayado (la parte está determinada por scrRect). Ahora asigno un conjunto de mapas de bits suficientemente grandes una vez, y luego los vuelvo a usar (canvas.drawBitmap (sourceBitmap, 0, 0, null); en ellos ...) para el almacenamiento de diferentes mapas de bits.

El código principal de la clase está a continuación, vea BitmapSubsetDrawable.java para el uso real.

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; 
    } 
} 
Cuestiones relacionadas