¿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?
102
Para cualquier cosa por debajo de Honeycomb (API nivel 11) tendrá que usar setLayoutParams(...)
.
Si puede limitar su apoyo a nido de abeja y hasta puede utilizar el setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, etc.
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
- así que tal vez esa no sea una buena idea;)Sí, puede establecer dinámicamente la posición de la vista en Android. Del mismo modo tiene una
ImageView
enLinearLayout
su xml file.So puede ajustar su posición a travésLayoutParams
.Pero asegúrese de tomarLayoutParams
según la disposición tomada en su xml file.There son diferentesLayoutParams
según la disposición tomada.Aquí está el código para configurar:
Espero que le sea de ayuda establecer la posición.
fuente
Ya existen diferentes respuestas válidas, pero ninguna parece sugerir correctamente qué método (s) usar en cuyo caso, excepto por 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), configuremarginLeft
/ enmarginTop
consecuencia.Si necesita cambiar la posición de forma inmediata y persistente (por ejemplo, para un ancla PopupMenu), llame adicionalmente
layout(l, t, r, b)
con las mismas coordenadas. Esto reemplaza lo que el sistema de diseño confirmará más adelante.Para cambios inmediatos (temporales) (como animaciones), use
setX()
/ en susetY()
lugar. En los casos en que el tamaño de los padres no depende de WRAP_CHILDREN, podría estar bien usarsetX()
/setY()
exclusivamente.Nunca use
setLeft()
/setRight()
/setBottom()
/setTop()
, consulte a continuación.Fondo : Los campos
mLeft
/mTop
/mBottom
/mRight
se completan desde los LayoutParams correspondientes en layout (). El sistema de diseño de vistas de Android llama al diseño de forma implícita y asincrónica. Por lo tanto, configurarMarginLayoutParams
parece ser la forma más segura y limpia de configurar 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 usa una Vista para representar un cursor, y se supone que debe ser reubicado y servir como un ancla de PopupMenu al mismo tiempo. En este caso, llamarlayout()
funcionó bien para mí.Los problemas con
setLeft()
ysetTop()
son:Llamarlos por sí solo no es suficiente; también debe llamar
setRight()
ysetBottom()
evitar estirar o reducir la vista.La implementación de estos métodos parece relativamente compleja (= hacer un 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()
ysetY()
trabajar fuera del sistema de diseño, y los valores correspondientes se tratan como un desplazamiento adicional a los valores de izquierda / arriba / abajo / derecha determinados por el sistema de diseño, cambiando 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).fuente
marginLeft
se puede configurarsetLayoutParams
con unnew FrameLayout.LayoutParams(width, height)
en el que se establece elmarginLeft
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 left, right, translationX / Y con una interfaz ligeramente diferente.
Así es como funciona:
Simplemente use los métodos estáticos de la clase ViewHelper, pase la vista y el valor que desee establecer.
fuente
Recomendaría usar
setTranslationX
ysetTranslationY
. Recién estoy comenzando con esto, pero esta parece ser la forma más segura y preferida de mover una vista. Supongo que depende mucho de lo que intentes hacer exactamente, pero esto me funciona bien para la animación 2D.fuente
Puede intentar utilizar los siguientes métodos, si está utilizando HoneyComb Sdk (API nivel 11).
El parámetro x es la posición x visual de esta vista.
El parámetro y es la posición visual y de esta vista.
Espero que te sea de ayuda. :)
fuente
Para el apoyo a todos los niveles de la API se puede utilizar es la siguiente:
fuente
Establezca la posición izquierda de esta vista en relación con su padre:
Establezca la posición correcta de esta vista en relación con su padre:
Establezca la posición superior de esta vista en relación con su padre:
Establezca la posición inferior de esta vista en relación con su padre:
Los métodos anteriores se utilizan para establecer la posición de la vista relacionada con su padre.
fuente
Utilice LayoutParams. Si está utilizando un LinearLayout, debe importar android.widget.LinearLayout.LayoutParams, de lo contrario, importe la versión adecuada de LayoutParams para el diseño que está usando, o provocará una ClassCastException , entonces:
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 .
fuente
Use
RelativeLayout
, coloque su vista en él, obtenga elRelativeLayout.LayoutParams
objeto de su vista y establezca los márgenes que necesite. Entonces invoquerequestLayout()
su punto de vista. Esta es la única forma que conozco.fuente
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.setX()
/ en susetY()
lugar. (Es posible que desee buscar más en la diferenciasetLeft()
ysetX()
)fuente
Una cosa a tener en cuenta con el posicionamiento es que cada vista tiene un índice relativo a su vista principal. Entonces, si tiene un diseño lineal con tres subvistas, cada una de las subvistas tendrá un índice: 0, 1, 2 en el caso anterior.
Esto le permite agregar una vista a la última posición (o al final) en una vista principal haciendo algo como esto:
Alternativamente, puede reemplazar una vista usando algo como lo siguiente:
fuente