viernes, 29 de julio de 2011

Comportamientos del Canvas.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.

3 comentarios:

  1. Igual no estoy entendiendo el problema, pero imagino que la solución fácil es buscar el parámetro en la documentación... y la difícil es montarse una animación suave y constante a base de variar el tamaño de los Rect... no?

    ResponderEliminar
  2. Podría ser, el caso es que no he encontrado nada en developer.android.com
    Tendré que buscar más, pero aquí dejo la pregunta.
    Si descubro algo lo comunicaré ;)

    ResponderEliminar
  3. Solo tienes que hacer el bitmap más ancho añadiendo espacio en negro por ambos extremos ;-)

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...