2011-06-30 19 views

Respuesta

93

Para cualquier cosa por debajo de Honeycomb (Nivel API 11) tendrás que usar setLayoutParams(...).

Si puede limitar su apoyo a Panal y hasta puede utilizar el setX(...), setY(...), setLeft(...), setTop(...), etc.

+29

de ViewGroup desde los documentos de setTop() http://developer.android.com/reference/android/view/View.html#setTop%28int%29: 'establece la posición superior de esta vista en relación con su padre Este método debe ser llamado por el sistema de diseño y, en general, no se debe llamar porque la propiedad puede cambiarse en cualquier momento por el diseño. - entonces tal vez esa no sea una buena idea;) – katzenhut

5

establecer la posición izquierda de este punto de vista con respecto a su padre:

view.setLeft(int leftPosition); 

Establecer la posición derecha de este punto de vista con respecto a su padre:

view.setRight(int rightPosition); 

Ajuste la posición de la parte superior de este punto de vista relativo a su padre:

view.setTop(int topPosition); 

Establezca la posición inferior de esta vista con respecto a su pare nt:

view.setBottom(int bottomPositon); 

Los métodos anteriores se utilizan para establecer la posición de la vista relacionada con su elemento primario.

+0

Lo sentimos Estos métodos no están disponibles. ¿Me puede enviar algún código? – AB1209

+5

Es HoneyComb (11) +. – Pijusn

+2

"Este método debe ser llamado por el sistema de disposición y, por lo general, no se debe llamar de otra manera, ya que el diseño puede cambiar la propiedad en cualquier momento". – GDanger

9

Puede intentar utilizar los siguientes métodos, si está utilizando HoneyComb Sdk (API Nivel 11).

view.setX(float x); 

El parámetro x es la posición visual x de esta vista.

view.setY(float y); 

El parámetro y es la posición visual y de esta vista.

Espero que sea útil para usted. :)

+3

Estoy trabajando en 2.2 Froyo y estos métodos no están disponibles en él. – AB1209

3

Usa RelativeLayout, coloca tu vista en ella, obtén RelativeLayout.LayoutParams objeto de tu vista y establece los márgenes que necesites. Luego llame al requestLayout() en su vista. Esta es la única forma que conozco.

36

Sí, puede establecer dinámicamente la posición de vista en Android. Del mismo modo, tiene un ImageView en LinearLayout de su archivo xml. Así que puede establecer su posición a través de LayoutParams. Pero asegúrese de tomar LayoutParams de acuerdo con el diseño tomado en su archivo xml. Existen diferentes LayoutParams según el diseño.

Aquí está el código para establecer:

LayoutParams layoutParams=new LayoutParams(int width, int height); 
    layoutParams.setMargins(int left, int top, int right, int bottom); 
    imageView.setLayoutParams(layoutParams); 

espero que será útil para establecer la posición.

+13

también tenga en cuenta que debe importar android.widget.LinearLayout.LayoutParams; porque el valor predeterminado es LayoutParams –

12

Yo recomiendo usar setTranslationX y setTranslationY. Solo estoy comenzando con esto yo mismo, pero estos parecen ser la forma más segura y preferida de mover una vista. Supongo que depende mucho de lo que intentes hacer exactamente, pero esto está funcionando bien para la animación 2D.

17

Hay una biblioteca llamada NineOldAndroids, que le permite usar la biblioteca de animación Honeycomb hasta la versión uno.

Esto significa que puede definir izquierda, derecha, la traducción X/Y con una interfaz ligeramente diferente.

Así es como funciona:

ViewHelper.setTranslationX(view, 50f); 

Usted sólo tiene que utilizar los métodos estáticos de la clase ViewHelper, pasar de la vista y el que jamás valor que desea configurarlo para.

3

Utilice LayoutParams. Si está utilizando un LinearLayout que tiene que importar android.widget.LinearLayout.LayoutParams, de lo contrario importar la versión correcta de LayoutParams para el diseño que está utilizando, o causará un ClassCastException, entonces:

LayoutParams layoutParams=new LayoutParams(int width, int height); 
layoutParams.setMargins(int left, int top, int right, int bottom); 
imageView.setLayoutParams(layoutParams); 

NB: tenga en cuenta que también puede usar imageView.setLeft (int dim), PERO ESTO NO establecerá la posición del componente, solo establecerá la posición del borde izquierdo del componente, el resto permanecerá en misma posición.

+0

entonces, ¿cómo podemos movernos? la vista a una posición específica sin afectar la vista original? – james

+0

No estoy seguro de haber entendido su problema porque si desea mover una vista la cambiará por el hecho de que la está moviendo. De todos modos, si desea mover una vista sobre otra independientemente de ella, es posible que necesite una vista FrameLayout para deslumbrar su diseño principal y, dentro de ella, puede colocar sus vistas independientes (obviamente, si desea que se mueva debajo de su vista principal, tiene que colocar el FrameLayout antes que el principal) –

2

Para el apoyo a todos los niveles de la API se puede utilizar it así:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0); 
+1

¿por qué el voto a favor? – Orr

+0

Porque quiere cambiar la posición y la solución anterior es mejor y no necesita animación – FireZenk

+0

Además, la traducción puede hacer que la vista se salga (parcialmente) de la pantalla – mewa

12

Hay diferentes respuestas válidas ya, pero ninguno parece sugerir adecuadamente qué método (s) para usar en este caso, con la excepción de las correspondientes restricciones de nivel API:

  • Si puede esperar para un ciclo de diseño y el grupo de vista padre apoya MarginLayoutParams (o una subclase), establecido marginLeft/marginTop alojamiento rdingly.

  • Si necesita cambiar la posición de forma inmediata y persistente (por ejemplo, para un ancla PopupMenu), adicionalmente llame al layout(l, t, r, b) con las mismas coordenadas. Esto reemplaza lo que el sistema de disposición confirmará más adelante.

  • Para cambios inmediatos (temporales) (tales como animaciones), utilice setX()/setY() lugar. En los casos en que el tamaño principal no dependa de WRAP_CHILDREN, podría estar bien utilizar setX()/setY() exclusivamente.

  • Nunca uso setLeft()/setRight()/setBottom()/setTop(), véase más adelante.

Antecedentes: Los campos mLeft/mTop/mBottom/mRight se llenan de los LayoutParams correspondientes en la disposición(). El sistema de vista de Android llama implícita y asíncronamente al diseño. Por lo tanto, configurar MarginLayoutParams parece ser la forma más segura y limpia de establecer la posición de forma permanente. Sin embargo, el retraso de diseño asíncrono podría ser un problema en algunos casos, p. cuando se usa una Vista para renderizar un cursor, y se supone que debe reubicarse y servir como un ancla PopupMenu al mismo tiempo. En este caso, llamar al layout() funcionó bien para mí.

Los problemas con setLeft() y setTop() son:

  • Llamándolos por sí sola no es suficiente - que también tienen que llamar setRight() y setBottom() para evitar el estiramiento o encogimiento de la vista.

  • La aplicación de estos métodos se ve relativamente complejo (= haciendo un trabajo para dar cuenta de la vista cambia de tamaño causados ​​por cada uno de ellos)

  • Ellos parecen causar problemas extraños con campos de entrada: EditText soft numeric keyboard sometimes does not allow digits

setX() y setY() trabajan fuera del sistema de disposición, y los valores correspondientes se tratan como un desplazamiento adicional a los valores izquierdo/superior/inferior/derecho determinados por el sistema de disposición, desplazando la vista en consecuencia. Parece que se han agregado para animaciones (donde se requiere un efecto inmediato sin pasar por un ciclo de diseño).

+0

Hola Stefan. ¿Podría aconsejarnos algunos libros o artículos donde puedo entender cómo funciona el sistema de diseño de Android? Entiendo esa secuencia de llamadas a layout() onMeasure() onDraw(), pero quiero conocer más detalles. Gracias de antemano –

+0

Lamentablemente no puedo - la mejor y más definitiva referencia parece ser el código fuente real de Android O :) –

Cuestiones relacionadas