2011-02-07 18 views
5

Tengo una aplicación de dibujo que permite al usuario dibujar en un lienzo en blanco. Estoy intentando dibujar una 'miniatura' escalada del mapa de bits actual para que cuando el usuario haya escalado en la Vista, puedan hacer referencia a la miniatura para tener una idea de dónde están en el lienzo del dibujo general. Tengo la escala funcionando, y estoy mostrando la miniatura en la ubicación correcta, pero parece que la miniatura no se está actualizando en los registros subsiguientes cuando se agregan nuevas líneas/formas.Lienzo de escala en Android Bitmap

Así que tengo acceso al mapa de bits subyacente para esta vista (para mostrar la imagen en miniatura, capaz de guardar fácilmente el mapa de bits en un archivo, etc) Yo lo siguiente en onSizeChanged() para el Vista:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    // set the canvas height, panning, etc, based on the now inflated View 
    mWidth  = getWidth(); 
    mHeight  = getHeight(); 
    mAspectRatio = mWidth/mHeight; 
    mPanX  = 0; 
    mPanY  = 0; 

    // create the Bitmap, set it to the canvas 
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
mCanvas.setBitmap(mBitmap); 
draw(mCanvas); 
} 

Entonces, cuando el usuario dibuja e invalidar() se llama, hago lo siguiente en onDraw() para generar la miniatura:

@Override 
protected void onDraw(Canvas canvas) { 
    <snipped code that draws paths, shapes to canvas> 

    if (mScaled) { 
     Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false); 
     canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 
    } 
} 

la miniatura se mostrará en el espacio definido por thumbnailRectF utilizando el thumbCanvasPaint , pero en las siguientes llamadas a OnDraw(), el mapa de bits escalado tiene no ha cambiado desde su estado original, aunque el lienzo activo de tamaño completo muestra todos los dibujos, etc. Según algunas pruebas, me parece que mientras estoy configurando el mapa de bits con la llamada inicial para dibujar (mCanvas) ;, subsiguientesDraws están escribiendo en el mapa de bits subyacente en lugar del especificado en onSizeChanged().

Creo que estoy intentando averiguar cómo ato el lienzo onDraw a un mapa de bits al que puedo acceder fácilmente para realizar nuevos tamaños, guardar, etc. Al mirar this question, pensé que el sorteo (mCanvas) ; call vincularía el onDraw al mapa de bits especificado en mCanvas (en mi caso, mBitmap), pero en la práctica, no parece estar funcionando, en lo que se refiere a actualizaciones para el lienzo.

Gracias,

Paul

Respuesta

6
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

debe cambiar a

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint); 

No hay necesidad de

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int).... 

Compruebe también que mScaled es cierto todo el tiempo cuando el zoom es gre ater de 1

+0

Puedo ver la similitud de su solución con este ejemplo: http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis

+0

Wow, sí, eso el programa vinculado está construido casi al 100%, a excepción de mi problema con vincular el mapa de bits al lienzo, etc. Probar esta solución ahora. –

0

escala de mapa de bits por Bitmap.createScaledBitmap entonces dibujar no funcionará

La solución para la escala del mapa de bits de la lona es utilizar esta función (de la docs)

void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) 
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into 

así cambiando el tamaño de dst , su tamaño de mapa de bits cambiará

Aquí está el ejemplo si quiero dibujar un mapa de bits en la esquina superior izquierda y escalarlo a 100px x 120px

Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn 

float left = 0; 
float top = 0; 
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120 

canvas.drawBitmap(bitmap, null, dst, null); 
Cuestiones relacionadas