2011-04-08 12 views
5

Tengo una imagen de una cara (250px X 250px) que está en un elemento de diseño absoluto. Actualmente obtengo las coordenadas táctiles del usuario y usando algunas matemáticas calculo lo que ha sido tocado (por ejemplo, la nariz), luego hago algo en consecuencia.Android - píxeles a salsas

Mi pregunta es cómo escalar esto para adaptarse al ancho de pantalla disponible. Si configuro la imagen (en el xml) para fill_parent, las coordenadas están fuera de alcance. ¿Se puede remediar esto convirtiendo las coordenadas táctiles a salsas (de ser así, cómo), o tendré que obtener el ancho de la pantalla (volver a convertir en dips) y resolver el problema de coordenadas utilizando más matemáticas?

Toda ayuda apreciada.

Respuesta

12

pixels = dps * (density/160)

El factor (density/160) se conoce como el factor de escala de densidad, y consiga ser recuperada en Java de la visualización del objeto de las dimensiones. Lo que debe hacer es almacenar la posición de la nariz, etc. en términos de dips (que son los mismos que los píxeles en una pantalla con densidad 160), y luego convertir dips en píxeles dependiendo de la pantalla en la que se ejecute:

+0

Muchas gracias por esto, será de gran ayuda. – Rooneyl

+0

pregunta adicional: si la nariz está en 125,125 (según la imagen de 250px), si configuro la imagen como fill_parent y escala al ancho de la pantalla (digamos 480px) cómo voy a establecer la posición de la nariz en los saltos, ya que el original 125,125 ahora sería el ojo izquierdo, por ejemplo? – Rooneyl

+0

intente utilizar la inmersión en lugar de xml estableciendo el alto y el ancho a 250dip de la imagen. – Abhi

5
public int getDip(int pixel) 
{ 
     float scale = getBaseContext().getResources().getDisplayMetrics().density; 
     return (int) (pixel * scale + 0.5f); 
} 
13

tengo tres funciones útiles en mi biblioteca ...

jugar a pantalla Densidad

public static float getDensity(Context context){ 
    float scale = context.getResources().getDisplayMetrics().density;  
    return scale; 
} 

Dip convertir a píxeles.

public static int convertDiptoPix(int dip){ 
    float scale = getDensity(); 
    return (int) (dip * scale + 0.5f); 
} 

convertir Pixels to Dips.

public static int convertPixtoDip(int pixel){ 
    float scale = getDensity(); 
    return (int)((pixel - 0.5f)/scale); 
} 
+0

¿Cómo se puede obtener getApplicationContext() en la declaración de una función estática? –

5

Una forma muy simple de hacerlo.

int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 250, (mContext).getResources().getDisplayMetrics()); 
Cuestiones relacionadas