Como posso alterar a posição de visualização por meio do código? Como mudar sua posição X, Y. É possível?
Como posso alterar a posição de visualização por meio do código? Como mudar sua posição X, Y. É possível?
Respostas:
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.
Sim, você pode definir dinamicamente a posição de visualização no Android. Da mesma forma você tem um ImageView
no LinearLayout
do seu xml file.So você pode definir a sua posição através LayoutParams
.Mas não deixe de fazer LayoutParams
de acordo com o layout tomado em seu xml file.There são diferentes LayoutParams
de acordo com o layout tomadas.
Aqui está o código a ser definido:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
Espero que seja útil para você definir a posição.
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), defina marginLeft
/ de marginTop
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()
/ no setY()
lugar. Nos casos em que o tamanho do pai não depende de WRAP_CHILDREN, pode ser adequado usar setX()
/ 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 o MarginLayoutParams
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, ligar layout()
funcionou bem para mim.
Os problemas com setLeft()
e setTop()
são:
Ligar sozinho não é suficiente - você também precisa ligar setRight()
e setBottom()
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()
e setY()
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).
marginLeft
pode ser definido usando setLayoutParams
com um new 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:
ViewHelper.setTranslationX(view, 50f);
Você apenas usa os métodos estáticos da classe ViewHelper, passa a visão e o valor que você deseja definir.
Eu recomendaria usar setTranslationX
e setTranslationY
. 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.
Você pode tentar usar os métodos a seguir, se estiver usando HoneyComb Sdk (API de nível 11).
view.setX(float x);
O parâmetro x é a posição visual x desta vista.
view.setY(float y);
O parâmetro y é a posição visual desta visualização.
Espero que seja útil para você. :)
Para suporte a todos os níveis de API, você pode usá- lo assim:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Defina a posição esquerda desta visualização em relação ao pai:
view.setLeft(int leftPosition);
Defina a posição correta desta visualização em relação ao seu pai:
view.setRight(int rightPosition);
Defina a posição superior desta visualização em relação à sua principal:
view.setTop(int topPosition);
Defina a posição inferior desta visualização em relação ao seu pai:
view.setBottom(int bottomPositon);
Os métodos acima são usados para definir a posição da visualização em relação ao seu pai.
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:
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
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 .
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ças setLeft()
esetX()
)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:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
Como alternativa, você pode substituir uma visualização usando algo como o seguinte:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
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;)