Android Canvas: coloque el texto con drawText en la misma ubicación en todas las resoluciones de pantalla

Parece que no puedo colocar el texto en los mismos lugares en pantallas de diferente resolución. El problema es que el texto está flotando, no forma parte de ningún tipo de control de diseño.

Intento colocar el texto en unidades relativas en comparación con el tamaño de la pantalla. Por ejemplo, lo puse al 50% en el eje X y al 67.89% en el eje Y. A pesar de eso, el texto aparece en una ubicación diferente en pantallas de diferente resolución.

Así que estoy atascado aproximando la ubicación para ciertas resoluciones y esto se complica muy rápido.

¿Cómo puedo señalar una ubicación en un lienzo que es el mismo lugar a pesar del tamaño de DPI / pantalla?

preguntado el 28 de agosto de 11 a las 00:08

2 Respuestas

Utilizan DisplayMetrics para calcular la distancia. Por ejemplo, si siempre desea que el texto esté a 1.5 pulgadas de la izquierda y la parte superior.

Esto funcionará con cualquier vista o mapa de bits en el que dibuje.

draw(Canvas canvas){
    Matrix identity = new Matrix; // Used to have canvas draw on
    Matrix savedMatrix = new Matrix();
    canvas.getMatrix(savedMatrix);
    canvas.setMatrix(identity);

    float y = displayMetrics.ydpi * 1.5;
    float x = displayMetrics.xdpi * 1.5;

    canvas.drawText(text, x, y + paint.getTextSize(), paint);
    canvas.setMatrix(savedMatrix);
}

Respondido 28 ago 11, 05:08

¿Cómo hago para que el dibujo de texto utilice la propia matriz (o incluso la cámara)? Lo necesito para esta pregunta: stackoverflow.com/q/32180534/878126 - desarrollador de Android

canvas.getMatrix () está en desuso después de api 16 - Bhavesh Rangani

La información sobre la densidad de visualización general (así como otras métricas) está disponible en la clase DisplayMetrics. Puedes recuperarlo así:

void getMetrics(Context context) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
}

http://developer.android.com/reference/android/util/DisplayMetrics.html

Puede escalar todas las coordenadas para tener en cuenta la densidad de la pantalla como esta:

void scaleForDensity(DisplayMetrics metrics, Point point) {
    point.x = (int)(point.x*metrics.density + .5f);
    point.y = (int)(point.y*metrics.density + .5f);
}

Respondido 28 ago 11, 05:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.