Eu tenho atividade e muitos widgets, alguns deles têm animações e, devido às animações, alguns dos widgets estão se movendo (traduzindo) um sobre o outro. Por exemplo, a exibição de texto está se movendo sobre alguns botões. . .
Agora, quero que os botões estejam sempre na frente. E quando a visualização de texto estiver em movimento, quero passar por trás dos botões.
Não consigo fazer isso, tentei tudo o que sei e "bringToFront ()" definitivamente não funciona.
note Observação: não quero controlar a ordem z pela ordem de colocação do elemento no layout, porque simplesmente não posso :), o layout é complexo e não consigo colocar todos os botões no início do layout
RelativeLayout
com a exibição "top" aparecendo por último no XML. Veja stackoverflow.com/a/31340762/1121497Respostas:
Você pode chamar bringToFront () na exibição que deseja exibir na frente
Isto é um exemplo:
fonte
A / B / C
e queria trazerA
para a frente, então, depois de executara.bringToFront()
, acabei com um layout comoB / C / A
.LinearLayout
que não pode ser usado combringToFront
. Acabei usando umRelativeLayout
. Veja meu comentário sobre a pergunta em si.ViewCompat.setTranslationZ(view, 1)
funciona perfeitamente, por outro lado.Eu estive pesquisando o estouro de pilha para encontrar uma boa resposta e, quando não consegui encontrar uma, procurei os documentos.
ninguém parece ter tropeçado nessa resposta simples ainda:
a tradução padrão z é 0,0
fonte
setZ()
? Se bem me lembro, a posição Z da vista é sua elevação mais sua translação Z, afinal.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
funciona apenas na API 21 e superior.Uma solução ainda mais simples é editar o XML da atividade. Usar
fonte
bringToFront()
é o caminho certo, mas NOTE que você deve chamarbringToFront()
einvalidate()
método na visualização de nível mais alto (na visualização raiz), por exemplo:A hierarquia da sua visualização é:
Portanto, quando você animar seus botões (1 a 6), seus botões estarão abaixo (abaixo) de
ImageView
. Para trazê-lo (acima),ImageView
você deve chamarbringToFront()
einvalidate()
método em seuLinearLayout
s. Então, ele funcionará :) ** NOTA: Lembre-se de definirandroid:clipChildren="false"
o layout raiz ou o gradparent_layout da animação-view. Vamos dar uma olhada no meu código real:.xml
Algum código em .java
GLuck!
fonte
ConstraintLayout
que contém umRelativeLayout
e outroRelativeLayout
, ambos têm o mesmo tamanho que sua raizConstraintLayout
(match_parent
). O primeiroRelativeLayout
tem umButton
e também está atrás (em ordem de z) do segundoRelativeLayout
. Posso fazerButton
com que o primeiroRelativeLayout
apareça como se estivesse em cima de tudo, para que fique visível e clicável usandoView::bringToFront()
?Com esse código em xml
fonte
90dp
veio?Tente
FrameLayout
, ele oferece a possibilidade de colocar as visualizações uma acima da outra. Você pode criar doisLinearLayouts
: um com vistas de segundo plano e outro com vistas de primeiro plano e combiná-los usando oFrameLayout
. Espero que isto ajude.fonte
Se você estiver usando
ConstraintLayout
, basta colocar o elemento após os outros elementos para torná-lo na frente do que os outrosfonte
Você pode tentar usar o
bringChildToFront
, você pode verificar se esta documentação é útil na página de desenvolvedores do Android .fonte
Pode haver outra maneira que salve o dia. Basta iniciar um novo diálogo com o layout desejado e apenas mostrá-lo. Eu preciso dele para mostrar um loadingView sobre um DialogFragment e essa foi a única maneira de obter sucesso.
bringToFront () pode não funcionar em alguns casos como o meu. Mas o conteúdo do layout dialog_top deve substituir qualquer coisa na camada da interface do usuário. Mas, enfim, essa é uma solução feia.
fonte
Eu enfrentei o mesmo problema. a seguinte solução funcionou para mim.
A segunda solução é usar xml adicionando esse atributo à visualização xml
fonte
Você pode usar o BindingAdapter assim:
fonte
Você precisa usar o framelayout. E a melhor maneira de fazer isso é tornar a visualização invisível quando não forem necessárias. Também é necessário definir a posição para cada vista, para que eles se movam de acordo com a posição correspondente
fonte
Se você estiver usando um,
LinearLayout
deverá ligarmyView.bringToFront()
e depois ligarparentView.requestLayout()
eparentView.invalidate()
forçar o pai a redesenhar com a nova ordem filho.fonte
Tente usar a elevação, algo como
yourview.setElevation(5);
fonte
Graças ao usuário do Stack sobre essa explicação, eu tenho esse trabalho mesmo no Android 4.1.1
No meu uso dinâmico, por exemplo, eu fiz
E Bamm!
fonte
Organize-os na ordem que você deseja mostrar. Suponha que você queira mostrar a vista 1 na parte superior da vista 2. Em seguida, escreva o código da vista 2 e depois escreva o código da vista 1. Se você não conseguir fazer esse pedido, chame bringToFront () para a visualização raiz do layout que você deseja trazer para a frente.
fonte
Você pode definir a visibilidade como falsa em outras visualizações.
ou
E definir
fonte