Gostaria de definir a ordem z das visualizações de um RelativeLayout no Android.
Eu sei que uma maneira de fazer isso é chamar bringToFront
.
Existe melhor maneira de fazer isso? Seria ótimo se eu pudesse definir a ordem z no xml do layout.
Gostaria de definir a ordem z das visualizações de um RelativeLayout no Android.
Eu sei que uma maneira de fazer isso é chamar bringToFront
.
Existe melhor maneira de fazer isso? Seria ótimo se eu pudesse definir a ordem z no xml do layout.
Respostas:
A maneira mais fácil é simplesmente prestar atenção à ordem em que as Views são adicionadas ao seu arquivo XML. Mais abaixo no arquivo significa mais alto no eixo Z.
Editar: está documentado aqui e aqui no site do desenvolvedor do Android. (Obrigado @flightplanner)
fonte
Se você quiser fazer isso no código, poderá fazer
ver documentos
fonte
Observe que os botões e outros elementos na API 21 ou superior têm uma elevação alta e, portanto, ignoram a ordem xml dos elementos, independentemente do layout pai. Levei um tempo para descobrir isso.
fonte
No Android, a partir do nível 21 da API, os itens no arquivo de layout obtêm sua ordem Z, tanto na forma como são ordenados no arquivo, conforme descrito na resposta correta, quanto na elevação, um valor de elevação mais alto significa que o item recebe uma ordem Z mais alta .
Às vezes, isso pode causar problemas, especialmente com botões que geralmente aparecem em cima de itens que, de acordo com a ordem do XML, devem estar abaixo deles na ordem Z. Para corrigir isso, defina os
android:elevation
itens no XML do layout para corresponder à ordem Z que você deseja atingir.Se você definir uma elevação de um elemento no layout, ele começará a projetar uma sombra. Se você não deseja esse efeito, pode remover a sombra com o código da seguinte forma:
Não encontrei nenhuma maneira de remover a sombra de uma visualização elevada através do xml de layout.
fonte
android:elevation="1000dp"
. Nenhuma sombra é renderizada dessa maneira.Encontrei os mesmos problemas: Em um layout relativo parentView, tenho 2 filhos childView1 e childView2. Inicialmente, coloquei childView1 acima de childView2 e quero que childView1 esteja no topo de childView2. Alterar a ordem dos pontos de vista das crianças não resolveu o problema para mim. O que funcionou para mim é definir android: clipChildren = "false" no parentView e no código que defini:
fonte
child.bringToFront()
comparent.invalidate()
obras, masparent.bringChildToFront(child)
não. Onde está a lógica que todos esperamos de um sistema operacional?android:clipChildren="false"
fiz o truque. Obrigado!Observe que você pode usar a
view.setZ(float)
partir do nível 21. da API. Aqui você pode encontrar mais informações.fonte
Pensei em acrescentar uma resposta desde a introdução do
O campo XML mudou um pouco as coisas. As outras respostas que sugerem execução
estão totalmente no EXCEPT, pois esse código NÃO colocará childView1 na frente de qualquer visualização com um android: translationZ codificado no arquivo XML. Eu estava tendo problemas com isso e, depois que removi esse campo dos outros modos de exibição, bringToFront () funcionou bem.
fonte
elevation
API 21 tem
view.setElevation(float)
build-inUse
ViewCompat.setElevation(view, float);
para compatibilidade com versões anterioresMais métodos
ViewCompat.setZ(v, pixels)
eViewCompat.setTranslationZ(v, pixels)
Outra maneira de coletar botões ou exibir a matriz e usar
addView
para adicionar ao RelativeLayoutfonte
childView.bringToFront () não funcionou para mim, então eu configurei a tradução Z do item adicionado menos recentemente (aquele que estava sobrepondo todos os outros filhos) a um valor negativo como este:
lastView.setTranslationZ(-10);
consulte https://developer.android.com/reference/android/view/View.html#setTranslationZZ(float) para obter mais
fonte
Você pode usar personalizado
RelativeLayout
com redefinidoprotected int getChildDrawingOrder (int childCount, int i)
Esteja ciente - este método usa param
i
como "qual visualização devo desenhari'th
". É assim queViewPager
funciona. Ele define a ordem de desenho personalizada em conjunto comPageTransformer
.fonte
Verifique se você tem alguma elevação em uma das vistas em XML. Nesse caso, adicione elevação ao outro item ou remova a elevação para resolver o problema. A partir daí, é a ordem dos pontos de vista que determina o que vem acima do outro.
fonte
Ou coloque o botão ou as vistas sobrepostas dentro de um FrameLayout. Em seguida, o RelativeLayout no arquivo xml respeitará a ordem dos layouts filhos à medida que forem adicionados.
fonte
Você pode usar o exemplo de código abaixo também para obter o mesmo
Isso é compatível com versões anteriores. Aqui
mCardView
está uma visão que deve estar abaixosourceView
.fonte