Comportamientos del Canvas.drawBitmap()

Este post está importado de mi blog de blogger.
En él explico el problema que tuve con la función drawBitmap.

Intentando dar soporte a mi aplicación Say It Quietly para todas las versiones de Android he dado con un problema al que, al comienzo de este post, no tengo muy claro como arreglarlo. Al menos se me ocurre una solución posible.

El problema:

Antes de nada, voy a intentar describir el problema. El texto es escrito en un bitmap. En cada repetición del thread voy recorriendo el bitmap con un Rect de ancho fijo (el alto de la pantalla, o el ancho si hablamos de landscape). El problema viene cuando el bitmap entra en escena, el Rect tiene valores negativos; o cuando el bitmap sale de escena, el right del Rect tiene valores que no pertenecen al bitmap.


En este gráfico se ve que tanto al aparecer el bitmap en pantalla como al salir de ella el Rect abarca un espacio vacío. Esto causa que en versiones de Android anteriores a la 2.2 drawBitmap estire la imagen al pintarla en la pantalla. Esto es lo que se ve:

Pantallazos de la entrada del texto en escena. Se puede apreciar como se estira la "S":

  



Pantallazos de la salida del texto de la escena. Se puede apreciar como se estira la "Y":

  




Solución fácil:

Es fácil porque no hay que pensar nada, simplemente programar para ajustar los Rect pasados al drawBitmap, de esta forma no habrá stretching.

Solución difícil:

Buscar si existe algún parámetro en el Canvas o el Paint o en algún sitio para cambiar el comportamiento del drawBitmap dependiendo de la versión de Android en que estemos corriendo la aplicación para que no haga stretching. Esto es "dificil" porque no se si existe algo así.

Cualquier idea para solucionar esto será bien recibida. Mientras tanto yo seguiré por el camino "fácil" que es un lío con los Rect, las posiciones y demás.

Fri, Jul 29th 2011, 16:59 | Android

0 Comments

Add New Comment

Your name:
Your e-mail:
Your web page:
Comment:
I would like to receive new comment notification.
Security code: