Pregunta ¿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?


74
2018-06-30 13:39


origen


Respuestas:


Para cualquier cosa que no sea Honeycomb (nivel 11 de API), tendrás que usar setLayoutParams(...).

Si puede limitar su soporte a Honeycomb y más, puede usar setX(...), setY(...), setLeft(...), setTop(...), etc.


101
2018-06-29 22:48



Sí, puedes establecer dinámicamente la posición de vista en Android. Del mismo modo que tienes una 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. Hay diferentes LayoutParams de 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.


37
2018-05-24 11:13



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.


17
2017-07-25 17:05



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.


14
2017-09-03 19:25



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 padre admite MarginLayoutParams (o una subclase), establecer marginLeft / marginTop en consecuencia.

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

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

Fondo: los mLeft / mTop / mBottom / mRight los campos se rellenan desde los correspondientes LayoutParams en layout (). El sistema de vista de Android llama implícita y asíncronamente al diseño. Por lo tanto, establecer el 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, llamando layout() funcionó bien para mí

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

  • Llamarlos solo no es suficiente; también debes llamar setRight() y setBottom() para evitar estirar o encoger 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() Trabajar 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).


13
2018-01-16 14:42



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. :)


10
2018-06-30 15:17



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.


5
2018-06-30 13:55



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 le 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 la misma posición. 


4
2018-04-08 09:14



Utilizar RelativeLayout, coloca tu vista en ella, obtén RelativeLayout.LayoutParams Objeto desde su vista y establezca los márgenes según lo necesite. Luego llame requestLayout() en su punto de vista. Esta es la única forma que conozco.


3
2017-11-12 09:28