2011-03-20 22 views
29

Para mi juego para Android tengo algunas llamadas al Canvas.drawText().Android: Canvas.drawText() Tamaño de texto en diferentes resoluciones de pantalla

Para las pruebas, utilizo el tamaño de letra estándar que parece funcionar bien.

Sin embargo, cuando aumento la resolución a una mayor densidad, las imágenes más grandes se cargan automáticamente pero el texto ahora es increíblemente pequeño.

¿Hay una manera fácil de calcular en qué tamaño debe dibujarse el texto o debo hacer esto manualmente?

editar: ¿Cuál era el punto de editing my post @Suragch?

+0

¿Se ha intentado usar [ScaledDensity] (http://developer.android.com/reference/android/util/DisplayMetrics.html#scaledDensity)? –

+0

Hola Marcin, sí, lo he usado y el multiplicador no parece hacer mucho. Por lo que yo sé, estoy usando la lógica multiplicadora correcta también. – twig

Respuesta

75

La forma más fácil es definir los tamaños de fuente en sus recursos con las unidades de píxeles independientes de la escala (sp) - esta unidad es como píxeles independientes densidad (dp o dip) en el que se tiene en cuenta la densidad de la pantalla pero también tiene en cuenta la configuración de tamaño de fuente del usuario.

Para añadir una nueva dimensión a crear un archivo dimens.xml en su carpeta res/values y escriba el siguiente código para agregar una nueva dimensión con el nombre myFontSize:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="myFontSize">20sp</dimen> 
</resources> 

entonces se puede obtener el tamaño del texto en su aplicación utilizando

int scaledSize = getResources().getDimensionPixelSize(R.dimen.myFontSize); 

El tamaño resultante se escalará correctamente para tener en cuenta la densidad de pantalla actual y la configuración del tamaño de fuente.

Para obtener más información, consulte el Android Developers page on More Resources.

+0

Método interesante, me aseguraré de probarlo cuando tenga la oportunidad. – twig

+0

Gracias Joseph, eso funcionó como un encanto. Debo admitir que lo estaba aplicando en el objeto Paint incorrecto y me di cuenta mucho más tarde. La solución de Marcin también funcionaría bien. – twig

+0

Joseph, dices ADD R.dimen.font_size y lo configuras en 20sp por ejemplo. Luego, al llamarlo, el 20sp se escalará automágicamente a la pantalla que sea. ¿O tenemos que agregar un número de dimensiones de tamaño de fuente para cada resolución de pantalla? – HGPB

4

La manera más fácil es definir el tamaño de fuente en el directorio de recursos con las unidades de scale-independent pixel (sp) o density-independent pixel (dp). A continuación, obtener el tamaño del texto usando

int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size); 
mTextView.setTextSize(scaledSize); 

Esto ajustará el texto de tamaño apropiadamente de acuerdo con la densidad/resolución de pantalla actual y el ajuste de tamaño de fuente del usuario.

¿Cómo se define el tamaño de fuente en el directorio de recursos?

Cree un archivo denominado dimens.xml en la carpeta res->values. Luego copie el siguiente código.

<resources> 
    <dimen name="font_size">25sp</dimen> // sp or dp accordingly 
</resources> 

El atributo name de la etiqueta <dimen> se utilizará como ID de recurso.

+1

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension lo tengo. – Trung

1

Al llamar a Canvas.drawText(), el tamaño del texto se determina primero por el objeto pasado en Paint, que se puede establecer a través de Paint.setTextSize(). El tamaño del texto se escala automáticamente por Canvas en función de la densidad del lienzo, que se puede encontrar en Canvas.getDensity().

Al configurar el tamaño de texto en un objeto de pintura que se dibujará en Canvas, trabaje con un valor unitario de dp o sp y permita que Canvas maneje la escala por usted.

0

Puede hacerlo usted mismo usando una simple operación matemática:

Es necesario para calcular una relación que se basa el texto sólo el mismo tamaño para cualquier tamaño del lienzo, a fin de utilizar el tamaño real de la lona, ​​así:

double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight()); 

Pero ese número es demasiado grande, por lo que se divide por uno que se adapte a sus necesidades, digamos 250:

relation = relation/250; 

Ahora puede establecer el tamaño de texto así:

paint.setTextSize((float) (myFontSize * relation)); 

Usted no tiene que dividir relación necesaria por cualquier número, pero en ese caso tendrá que utilizar muy pequeños tamaños de fuente para la variable myFontSize. Para mí, 250 funciona bien para usar tamaños de fuente regulares que se ajustarán a cualquier tamaño de pantalla, dado que ya está tomando en cuenta la dimensión de píxeles de su lienzo.

Cuestiones relacionadas