2011-05-17 12 views
9

Mi aplicación es solo un ImageViewer modificado con las opciones de acercar y arrastrar. Con ese Imageviewer modificado hay un RelativeLayout (que quiero usar como AbsoluteLayout).Usar RelativeLayout dinámicamente y establecer márgenes en px, dp, inch, mm

Luego, se pueden agregar nuevos elementos al diseño para ubicarlos en ciertos puntos de la imagen. La posición (x, y) en píxeles de los elementos está en una base de datos, así que supongo que no hay otra forma de agregarlos mediante programación, y no con XML.

Luego, la posición de esos elementos se actualiza cada vez que se realiza una acción de arrastre o acercamiento.

¡El problema es que de alguna manera los píxeles de la imagen no coinciden con los píxeles en el RelativeLayout! Por lo tanto, los elementos están "más o menos" situados pero no en el lugar correcto (cuanto más lejos esté de (0,0), mayor es el error).

cosas que he intentado ya:

  • probar diferentes conversiones porque tal vez el problema está relacionado con la diferencia de densidades entre el mapa de bits y el diseño:

    Resources r = getResources(); 
    float x = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics()); 
    
  • intenta utilizar diferentes métodos en el diseño para establecer los márgenes:

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.leftMargin = (int) newPosition.x; 
    params.topMargin = (int) newPosition.y; 
    element.setLayoutParams(params); 
    
  • También quería utilizar las opciones disponibles para el RelativeLayout en XML, pero realmente no puedo encontrar mediante programación pero puedo encontrar la manera de especificar la dimensión, quiero decir:

    android:layout_marginLeft ="50px" // or "50mm", or dp, or inches... 
    

Respuesta

4

Prueba esto: para Disposición relativa puede establecer los márgenes de esta manera: params.setMargins(left, top, right, bottom);

+0

Hola Rosalie, el problema con este método es que solo quiero establecer el margen izquierdo y el margen superior, no los cuatro márgenes. –

+2

ok ... entonces puede pasar algunos valores enteros a la izquierda y arriba y para otros puede dar cero. Entonces se resolverá, supongo. – Lavanya

3

que he encontrado la respuesta, el problema era, de hecho, con la densidad, por lo que hizo:

DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    float density = metrics.density; 
    //And then I add a new element like: realX*density, realY*density 

I d no entiendo tanto lo que está haciendo, pero funciona ... En realidad, lo que no entiendo es el valor metrics.density Cualquier explicación es bienvenida.

20

Puede ajustar la altura, la anchura y el margen por el código de abajo:

//headView 
RelativeLayout.LayoutParams head_params = (RelativeLayout.LayoutParams)headView.getLayoutParams(); 
head_params.setMargins(80, 0, 0, 0); //substitute parameters for left, top, right, bottom 
head_params.height = 60; head_params.width = 200; 
headView.setLayoutParams(head_params); 

Dónde headView es la vista de su aplicación.

Disfrútalo. :)

+1

Solo para agregar más información (sé que ha pasado más de un año). Siguiendo los documentos [enlace] (http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html#setMargins (int,% 20int,% 20int,% 20int)) una llamada a 'requestLayout() 'debe hacerse para tener en cuenta los márgenes. – khose

Cuestiones relacionadas