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)
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.
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:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Não encontrei nenhuma maneira de remover a sombra de uma visualização elevada através do xml de layout.
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:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
com parent.invalidate()
obras, mas parent.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.
Pensei em acrescentar uma resposta desde a introdução do
android: translationZ
O campo XML mudou um pouco as coisas. As outras respostas que sugerem execução
childView1.bringToFront();
parentView.invalidate();
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.
elevation
API 21 tem view.setElevation(float)
build-in
Use ViewCompat.setElevation(view, float);
para compatibilidade com versões anteriores
Mais 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 RelativeLayout
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
Você pode usar personalizado RelativeLayout
com redefinido
protected int getChildDrawingOrder (int childCount, int i)
Esteja ciente - este método usa param i
como "qual visualização devo desenhar i'th
". É assim que ViewPager
funciona. Ele define a ordem de desenho personalizada em conjunto com PageTransformer
.
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.