2010-11-27 13 views
27

Esto es cómo dibujo Bitmap en Canvas en mi aplicación Android:Dibujar mapas de bits sin problemas a escala en lona

canvas.save(); 
canvas.scale(scale, scale, x, y); 
canvas.drawBitmap(bitmap, x, y, null); 
canvas.restore(); 

Sin embargo, el Bitmap no se escala sin problemas, no se realiza el suavizado. ¿Cómo puedo habilitar el anti-aliasing?

+1

Sólo una nota. Si desea simplemente un resultado cuadrado, ya sea que necesite aumentar o reducir la escala, use este consejo increíblemente útil ... stackoverflow.com/a/17733530/294884 Espero que ayude a alguien – Fattie

Respuesta

68

Prueba esto:

Paint paint = new Paint(); 
paint.setAntiAlias(true); 
paint.setFilterBitmap(true); 
paint.setDither(true); 

canvas.drawBitmap(bitmap, x, y, paint); 
+14

Gracias, funcionó, acabo de utilizar 'Pintura de pintura = pintura nueva (Paint.FILTER_BITMAP_FLAG); ' – fhucho

+4

No estoy contento con esto. ¿Estás escalando tus imágenes hacia arriba o hacia abajo? – teedyay

+0

Solo pensé en repetir que agregar setFilterBitmap (true) y setDither (true) ADEMÁS de setAntiAlias ​​(true) hace una gran diferencia en los dispositivos Wear. –

16

Tanto Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); o paint.setFilterBitmap(true); trabajaron para mí, pero tenga mucho cuidado, en mi juego se redujo el FPS de 30FPS sólo 17FPS. Entonces, si es un dibujo de misión crítica como en un juego, es mejor escalar la imagen en el momento de la carga. Lo cual hice de la siguiente manera:

public Bitmap getImage (int id, int width, int height) { 
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), id); 
    Bitmap img = Bitmap.createScaledBitmap(bmp, width, height, true); 
    bmp.recycle(); 
    return img; 
} 
+0

createScaledBitmap es la única solución que produjo una ventaja suave para mí. ¡Gracias! – Tiago

0

Uso:

canvas.drawBitmap(source, 0, 0, new Paint(Paint.ANTI_ALIAS_FLAG)); 
+0

Por favor, no solo agregue código, también proporcione alguna explicación. –

+0

@Rohan: La pregunta era: "Dibuje mapas de bits a escala suave en Lienzo", entonces podría usar, por ejemplo, canvas.drawBitmap (fuente, 0, 0, pintura nueva (Paint.ANTI_ALIAS_FLAG)); para esto. ¿Entendiste ahora? – Ingo

+0

@Rohan: en el otro lado: ¿Por qué debería proporcionar aquí código redudant? Por favor, lea los otros Answeres antes. – Ingo

Cuestiones relacionadas