¿Cómo puedo establecer dinámicamente la posición de vista en Android?

¿Cómo puedo cambiar la posición de la vista a través del código? Como cambiar su posición X, Y. ¿Es posible?

Para cualquier cosa que esté por debajo de Honeycomb (nivel 11 de API), tendrás que usar setLayoutParams(...) .

Si puede limitar su soporte a Honeycomb y hacia arriba, puede usar setX(...) , setY(...) , setLeft(...) , setTop(...) , etc.

Sí, puedes 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 acuerdo con el diseño tomado en su archivo xml. Hay diferentes LayoutParams acuerdo con el diseño tomado.

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 sea útil establecer un puesto.

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); 

Simplemente use los métodos estáticos de la clase ViewHelper, pase la vista y el valor al que quiera establecerlo.

Ya existen diferentes respuestas válidas, pero ninguna parece sugerir correctamente qué método (s) usar, en cuyo caso, a excepción de las restricciones de nivel API correspondientes:

  • Si puede esperar un ciclo de diseño y el grupo de vista principal admite MarginLayoutParams (o una subclase), establezca marginLeft / marginTop consecuencia.

  • Si necesita cambiar la posición de forma inmediata y persistente (por ejemplo, para un anclaje PopupMenu), también 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) (como animaciones), use setX() / setY() lugar. En los casos en que el tamaño principal no dependa de WRAP_CHILDREN, podría estar bien usar setX() / setY() exclusivamente.

  • Nunca use setLeft() / setRight() / setBottom() / setTop() , vea abajo.

Antecedentes : los mLeft / mTop / mBottom / mRight se llenan desde los correspondientes LayoutParams en layout (). 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 la disposición asíncrona puede ser un problema en algunos casos, por ejemplo, cuando se utiliza una vista para representar un cursor, y se supone que debe ser reubicada y servir como un ancla de PopupMenu al mismo tiempo. En este caso, llamar a layout() funcionó bien para mí.

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

  • No es suficiente llamarlos solo; también debe llamar a setRight() y setBottom() para evitar el estiramiento o la reducción de la vista.

  • La implementación de estos métodos parece relativamente compleja (= hacer algún trabajo para tener en cuenta los cambios de tamaño de vista causados ​​por cada uno de ellos)

  • Parecen causar problemas extraños con los campos de entrada: el teclado numérico suave EditText a veces no permite dígitos

setX() y setY() funcionan 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).

Yo recomendaría 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.

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 x visual de esta vista.

 view.setY(float y); 

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

Espero que te sea útil. 🙂

Establezca la posición izquierda de esta vista en relación con su elemento principal:

 view.setLeft(int leftPosition); 

Establezca la posición correcta de esta vista en relación con su elemento principal:

 view.setRight(int rightPosition); 

Establezca la posición superior de esta vista en relación con su elemento principal:

 view.setTop(int topPosition); 

Establezca la posición inferior de esta vista en relación con su elemento principal:

 view.setBottom(int bottomPositon); 

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

Use LayoutParams. Si está utilizando LinearLayout, debe importar android.widget.LinearLayout.LayoutParams; de lo contrario, importe la versión adecuada de LayoutParams para el diseño que está utilizando, o se generará una ClassCastException , luego:

 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 rest permanecerá en la misma posición.

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

Para admitir todos los niveles de API, puede usarlo así:

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

Descubrí que @Stefan Haustein se acerca mucho a mi experiencia, pero no estoy seguro al 100%. Mi sugerencia es:

  • setLeft() / setRight() / setBottom() / setTop() no funcionará a veces.
  • Si desea establecer una posición temporalmente (por ejemplo, para hacer una animación, no afecta a una jerarquía) cuando la vista se agregó y se muestra , simplemente use setX() / setY() lugar. (Es posible que desee buscar más en la diferencia setLeft() y setX() )
  • Y tenga en cuenta que X, Y parece ser absoluto, y que fue admitido por AbsoluteLayout, que ahora está en desuso. Por lo tanto, sientes que X, Y probablemente ya no sea compatible. Y sí, lo es, pero solo parcialmente. Significa que si su vista es agregada, setX (), setY () funcionará perfectamente ; de lo contrario, cuando intente agregar una vista al diseño del grupo de vista (por ejemplo, FrameLayout, LinearLayout, RelativeLayout), debe establecer sus LayoutParams con marginLeft, marginTop en su lugar (setX (), setY () en este caso no funcionará a veces).
  • Establezca la posición de la vista por marginLeft y marginTop es un proceso no sincronizado . Por lo tanto, necesita un poco de tiempo para actualizar la jerarquía . Si utiliza la vista de inmediato después de establecer el margen para ello, es posible que obtenga un valor incorrecto .