¿Cómo puedo establecer dinámicamente la posición de la 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 debajo de Honeycomb (API Level 11) tendrás que usar setLayoutParams(...) .

Si puede limitar su compatibilidad con Honeycomb y subir, puede utilizar setX(...) , setY(...) , setLeft(...) , setTop(...) , etc.

Sí, puede establecer dinámicamente la posición de la 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 al 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 le sea de ayuda establecer la posición.

Hay una biblioteca llamada NineOldAndroids , que le permite utilizar la biblioteca de animación Honeycomb todo el camino hasta la versión uno.

Esto significa que usted puede definir izquierda, derecha, translationX / Y con una interfaz ligeramente diferente.

Así es como funciona:

 ViewHelper.setTranslationX(view, 50f); 

Simplemente utilice los métodos estáticos de la clase ViewHelper, pase la vista y el valor que desea establecer.

Recomendaría usar setTranslationX y setTranslationY . Yo sólo estoy empezando en esto yo mismo, pero estos parecen ser la manera más segura y preferida de mover una vista. Supongo que depende mucho de lo que estás tratando de hacer, pero esto está funcionando bien para mí para la animación 2D.

Ya existen varias respuestas válidas, pero ninguna parece sugerir adecuadamente qué método utilizar, en cuyo caso, a excepción de las restricciones de nivel de 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 ancla de PopupMenu), además, llame al layout(l, t, r, b) con las mismas coordenadas. Esto previene lo que el sistema de disposición confirmará más tarde.

  • Para cambios inmediatos (temporales) (como animaciones), utilice setX() / setY() . En los casos en que el tamaño del padre no depende de WRAP_CHILDREN, puede ser setX() usar setX() / setY() .

  • Nunca utilice setLeft() / setRight() / setBottom() / setTop() , ver más abajo.

Antecedentes : Los mLeft / mTop / mBottom / mRight se llenan de los LayoutParams correspondientes en layout (). Layout es llamado implícita y asincrónicamente por el sistema de diseño de vista de Android. Por lo tanto, establecer el MarginLayoutParams parece ser la forma más segura y más limpia para establecer la posición de forma permanente. Sin embargo, el retraso de diseño asincrónico puede ser un problema en algunos casos, por ejemplo, cuando se utiliza una vista para representar un cursor, y se supone que se vuelve a colocar y servir como un anclaje PopupMenu al mismo tiempo. En este caso, el layout() llamada layout() funcionó bien para mí.

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

  • Llamarlos solo no es suficiente – también necesita llamar a setRight() y setBottom() para evitar que se estire o se contraiga la vista.

  • La implementación de estos métodos parece relativamente compleja (= haciendo 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: EditText teclado numérico suave a veces no permite dígitos

setX() y setY() trabajan fuera del sistema de disposición, y los valores correspondientes se tratan como un desplazamiento adicional a los valores de izquierda / superior / inferior / derecha determinados por el sistema de disposición, cambiando la vista en consecuencia. Parecen haber sido agregados para las animaciones (donde un efecto inmediato sin pasar por un ciclo de disposición se requiere).

Puede probar a 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 sea útil para usted. 🙂

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

 view.setLeft(int leftPosition); 

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

 view.setRight(int rightPosition); 

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

 view.setTop(int topPosition); 

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

 view.setBottom(int bottomPositon); 

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

Utilice LayoutParams. Si está utilizando LinearLayout, tiene que importar android.widget.LinearLayout.LayoutParams, si no importa la versión adecuada de LayoutParams para el diseño que está utilizando, o causará una ClassCastException , entonces:

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

Nota: tenga en cuenta que puede utilizar también 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.

Use RelativeLayout , coloque su vista en ella, obtenga el objeto RelativeLayout.LayoutParams desde su vista y establezca los márgenes según sus necesidades. Luego llama a requestLayout() en tu vista. Esta es la única manera que conozco.

Para obtener soporte para todos los niveles de API, puede utilizarlo de esta manera:

 ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0); 
  • ¿Cómo usar la vista propia en el diseño?
  • ¿Cómo usar la aleta de vista con tres diseños?
  • El onQueryTextSubmit en SearchView se procesa dos veces en Android Java
  • SearchView gana el foco y abre el teclado cuando regresa de otra actividad
  • ¿Cuál es la forma más rápida de agregar varias vistas a un LinearLayout?
  • ¿Cómo agrego un botón a una clase "extends View"?
  • ¿Hay una manera de crear el stackoverfow "Etiquetas" EditText / Campo de entrada en Android?
  • Presentar contenido html como "páginas dinámicas"
  • Android DataBinding dónde obtener el contexto?
  • Android: cómo determinar la última letra totalmente visible en TextView?
  • Android: vista de 360 ​​grados de un objeto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.