2012-09-14 622 views
7

No puedo obtener lisa animación de texto muy lento en un lienzo porque Canvas.drawText no desea dibujar "entre píxeles". Por ejemplo, dados 4 marcos consecutivos donde dibujo un texto con un desplazamiento Y de 0, 0.5, 1, 1.5, el lienzo en realidad lo dibujará en los desplazamientos 0, 0, 1, 1, respectivamente, lo que hace que la animación sea " espasmódico". Hay una bandera llamada Paint.SUBPIXEL_TEXT_FLAG que se supone que mantiene la precisión del flotador.Una animación de texto suave muy lenta en un lienzo de Android, SUBPIXEL_TEXT_FLAG no funciona

Encontré un hilo relacionado en el que Romain Guy dijo que esta bandera actualmente no es compatible con Android: Meaning of some Paint constants in Android.

Mi pregunta es: ¿hay alguna solución existente?

Nota: Dibujar el texto en otro mapa de bits una vez, luego dibujar este mapa de bits con compensaciones flotantes en lugar de dibujar el texto, tampoco parece funcionar.

Respuesta

3

Puede simular este efecto dibujando dos textos uno al lado del otro con balance alfa (entre 127 y 255) entre los dos elementos.

Supongamos que su texto se mueve de arriba a abajo, y la posición vertical actual es 10.28. Sólo tienes que dibujar un texto en la posición 10 con un alfa cerca de 127 y el otro texto en la posición 11 con un alfa cerca de 255.

aquí es un poco (fea: D) ejemplo:

private void doDraw(Canvas canvas) { 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setColor(Color.BLACK); 
    paint.setTextSize(20); 
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 

    mY += 0.05f; 
    paint.setColor(Color.RED); 

    if (Math.floor(mY) == mY) { 
     canvas.drawText("test", mX, mY, paint); 
    } else { 
     float mY1 = (float) Math.floor(mY); 
     float mY2 = mY1 + 1; 
     float delta = mY - mY1; 

     paint.setAlpha((int) ((1 - delta) * 127) + 127); 
     canvas.drawText("test", mX, mY1, paint); 

     paint.setAlpha((int) ((delta) * 127) + 127); 
     canvas.drawText("test", mX, mY2, paint); 
    } 
} 
+0

Gracias por su respuesta, esa es una solución bastante buena, y de hecho está cerca de lo que esperaba 'Paint.SUBPIXEL_TEXT_FLAG' hacer. Aunque tiene algunas desventajas. El texto se dibuja dos veces, y con antialiasing, que causa un efecto borroso no deseado junto con un _fake bold_ text, más o menos. Trataré de jugar un poco con eso, pero por lo que puedo ver, todavía no es fácil. Tenga en cuenta que estoy usando una pantalla de 42 "con una resolución de 1280x720: un píxel es bastante grande y la animación está muy lejos de ser uniforme. – Joan

+0

De hecho, el texto se verá en negrita, pero debe tener en cuenta que, dado que El texto no se puede dibujar entre dos píxeles, por lo que tiene que trabajar con eso dibujándolo en dos píxeles. No creo que haya otra solución, pero, por supuesto, el algoritmo puede mejorarse. – DayS

+0

Te retendré publicado, si no puedo encontrar algo mejor, me resignaré y validaré tu respuesta. :) Por ahora, espero que haya un truco de magia en alguna parte. – Joan

Cuestiones relacionadas