Como posso alterar a posição de visualização por meio do código? Como mudar sua posição X, Y. É possível?
102
Para qualquer coisa abaixo do Honeycomb (API de nível 11), você terá que usar setLayoutParams(...)
.
Se você pode limitar seu apoio para Honeycomb e se você pode usar o 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.
- então talvez não seja uma ideia tão boa;)Sim, você pode definir dinamicamente a posição de visualização no Android. Da mesma forma você tem um
ImageView
noLinearLayout
do seu xml file.So você pode definir a sua posição atravésLayoutParams
.Mas não deixe de fazerLayoutParams
de acordo com o layout tomado em seu xml file.There são diferentesLayoutParams
de acordo com o layout tomadas.Aqui está o código a ser definido:
Espero que seja útil para você definir a posição.
fonte
Já existem diferentes respostas válidas, mas nenhuma parece sugerir adequadamente quais métodos usar nesse caso, exceto para as restrições de nível de API correspondentes:
Se você pode esperar por um ciclo de layout e o grupo de visão pai suporta
MarginLayoutParams
(ou uma subclasse), definamarginLeft
/ demarginTop
acordo.Se você precisar mudar a posição imediatamente e persistentemente (por exemplo, para uma âncora PopupMenu), adicionalmente chame
layout(l, t, r, b)
com as mesmas coordenadas. Isso antecipa o que o sistema de layout confirmará mais tarde.Para mudanças imediatas (temporárias) (como animações), use
setX()
/ nosetY()
lugar. Nos casos em que o tamanho do pai não depende de WRAP_CHILDREN, pode ser adequado usarsetX()
/setY()
exclusivamente.Nunca use
setLeft()
/setRight()
/setBottom()
/setTop()
, veja abaixo.Antecedentes : Os
mLeft
/mTop
/mBottom
/mRight
campos ficar cheia dos LayoutParams correspondentes no layout (). O layout é chamado de forma implícita e assíncrona pelo sistema de layout de visualização do Android. Portanto, definir oMarginLayoutParams
parece ser a maneira mais segura e limpa de definir a posição permanentemente. No entanto, o atraso de layout assíncrono pode ser um problema em alguns casos, por exemplo, ao usar uma visualização para renderizar um cursor, e deve ser reposicionado e servir como uma âncora do PopupMenu ao mesmo tempo. Nesse caso, ligarlayout()
funcionou bem para mim.Os problemas com
setLeft()
esetTop()
são:Ligar sozinho não é suficiente - você também precisa ligar
setRight()
esetBottom()
evitar esticar ou diminuir a visualização.A implementação desses métodos parece relativamente complexa (= fazer algum trabalho para contabilizar as mudanças no tamanho da visualização causadas por cada um deles)
Eles parecem causar problemas estranhos com os campos de entrada: o teclado numérico virtual EditText às vezes não permite dígitos
setX()
esetY()
trabalhar fora do sistema de layout, e os valores correspondentes são tratados como um deslocamento adicional para os valores esquerdo / superior / inferior / direito determinados pelo sistema de layout, mudando a visualização de acordo. Eles parecem ter sido adicionados para animações (onde um efeito imediato sem passar por um ciclo de layout é necessário).fonte
marginLeft
pode ser definido usandosetLayoutParams
com umnew FrameLayout.LayoutParams(width, height)
no qual você definiu omarginLeft
Existe uma biblioteca chamada NineOldAndroids , que permite que você use a biblioteca de animação Honeycomb até a versão um.
Isso significa que você pode definir a esquerda, a direita, translationX / Y com uma interface ligeiramente diferente.
É assim que funciona:
Você apenas usa os métodos estáticos da classe ViewHelper, passa a visão e o valor que você deseja definir.
fonte
Eu recomendaria usar
setTranslationX
esetTranslationY
. Estou apenas começando a fazer isso, mas parece ser a maneira mais segura e preferida de mover uma vista. Acho que depende muito do que exatamente você está tentando fazer, mas está funcionando bem para mim para animação 2D.fonte
Você pode tentar usar os métodos a seguir, se estiver usando HoneyComb Sdk (API de nível 11).
O parâmetro x é a posição visual x desta vista.
O parâmetro y é a posição visual desta visualização.
Espero que seja útil para você. :)
fonte
Para suporte a todos os níveis de API, você pode usá- lo assim:
fonte
Defina a posição esquerda desta visualização em relação ao pai:
Defina a posição correta desta visualização em relação ao seu pai:
Defina a posição superior desta visualização em relação à sua principal:
Defina a posição inferior desta visualização em relação ao seu pai:
Os métodos acima são usados para definir a posição da visualização em relação ao seu pai.
fonte
Use LayoutParams. Se você estiver usando um LinearLayout, terá que importar android.widget.LinearLayout.LayoutParams, caso contrário, importe a versão adequada de LayoutParams para o layout que você está usando, ou isso causará uma ClassCastException , então:
NB: Observe que você também pode usar imageView.setLeft (int dim), MAS ISTO NÃO definirá a posição do componente, ele definirá apenas a posição da borda esquerda do componente, o resto permanecerá na mesma posição .
fonte
Use
RelativeLayout
, coloque sua visão nele, pegue oRelativeLayout.LayoutParams
objeto de sua visão e defina as margens conforme necessário. Então invoquerequestLayout()
sua opinião. Esta é a única maneira que conheço.fonte
Descobri que @Stefan Haustein chega muito perto da minha experiência, mas não tenho certeza 100%. Minha sugestão é:
setLeft()
/setRight()
/setBottom()
/setTop()
às vezes não funciona.setX()
/ emsetY()
vez disso. (Você pode querer pesquisar mais diferençassetLeft()
esetX()
)fonte
Uma coisa a ter em mente com o posicionamento é que cada visualização possui um índice relativo à visualização pai. Portanto, se você tiver um layout linear com três subvisualizações, cada uma das subvisualizações terá um índice: 0, 1, 2 no caso acima.
Isso permite que você adicione uma visualização à última posição (ou final) em uma visualização pai fazendo algo assim:
Como alternativa, você pode substituir uma visualização usando algo como o seguinte:
fonte