É possível obter margem negativa no layout de restrição para obter sobreposição? Estou tentando ter uma imagem centralizada no layout e ter uma visualização de texto de forma que se sobreponha a x dp. Tentei definir o valor da margem negativa, mas sem sorte. Seria ótimo se houvesse uma maneira de conseguir isso.
118
Respostas:
Esclarecimento: a resposta abaixo continua válida, mas quero esclarecer algumas coisas. A solução original colocará uma vista com um deslocamento negativo de fato em relação a outra vista conforme declarado e aparecerá no layout conforme mostrado.
Outra solução é usar a propriedade translationY conforme sugerido por Amir Khorsandi aqui . Eu prefiro essa solução mais simples com uma ressalva: a tradução ocorre após o layout , de modo que as vistas que são restritas à vista deslocada não sigam a tradução.
Por exemplo, o seguinte XML exibe dois TextViews imediatamente abaixo da imagem. Cada visualização é restrita de cima para baixo com a visualização que aparece imediatamente acima dela.
Agora, vamos traduzir o "Diga meu nome" TextView por
50dp
especificandoIsso produz o seguinte:
O TextView "Diga meu nome" mudou conforme o esperado, mas o TextView "Diga" não o acompanhou como esperávamos. Isso ocorre porque a tradução ocorre após o layout . Embora a visualização se mova após o layout, ela ainda pode ser clicada na nova posição.
Então, IMO, vá com translationX e translationY para margens negativas em ConstraintLayout se a advertência acima não afetar seu layout; caso contrário, vá com o widget de espaço conforme descrito abaixo.
Resposta original
Embora não pareça que as margens negativas serão suportadas
ConstraintLayout
, existe uma maneira de conseguir o efeito usando as ferramentas disponíveis e suportadas. Aqui está uma imagem onde o título da imagem é sobreposto22dp
na parte inferior da imagem - efetivamente uma-22dp
margem:Isso foi feito usando um
Space
widget com uma margem inferior igual ao deslocamento que você deseja. OSpace
widget, então, tem sua parte inferior restrita à parte inferior doImageView
. Agora tudo que você precisa fazer é restringir a parte superior doTextView
com o título da imagem na parte inferior doSpace
widget. OTextView
será posicionado na parte inferior daSpace
visualização, ignorando a margem que foi configurada.A seguir está o XML que realiza esse efeito. Vou notar que uso
Space
porque é leve e destinado a esse tipo de uso, mas poderia ter usado outro tipo deView
e torná-lo invisível. (Você provavelmente precisará fazer ajustes, no entanto.) Você também pode definir aView
com margens zero e a altura da margem de inserção desejada e restringir a parte superior daTextView
ao topo da inserçãoView
.Outra abordagem seria sobrepor a
TextView
parteImageView
superior alinhando parte superior / inferior / esquerda / direita e fazer ajustes adequados nas margens / preenchimento. O benefício da abordagem demonstrada a seguir é que uma margem negativa pode ser criada sem muitos cálculos. Isso quer dizer que existem várias maneiras de abordar isso.Atualização: para uma rápida discussão e demonstração dessa técnica, consulte a postagem do blog Google Developers Medium .
Margem negativa para
ConstraintLayout
XMLfonte
ImageView
é centrado no pai,TextView
é sobreposição acimaImageView
. Em seguida,Space
comete o erro quando o App volta do fundo. Acho que 0dp, 0dp causa alguns problemas. Que tal apenas usarGuideline
.Outra forma é usar
translationX
outranslationY
assim:vai funcionar como
android:layout_marginRight="-25dp"
fonte
Siga estas duas questões:
https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866
fonte
Isso é o que descobri depois de horas tentando encontrar uma solução.
Vamos considerar duas imagens, imagem1 e imagem2. Image2 deve ser colocado no topo da image1 posicionada no lado inferior direito.
Exemplo de vistas sobrepostas
Podemos usar o widget Espaço para visualizações sobrepostas.
Restrinja os quatro lados do widget de Espaço com os quatro lados da imagem1 respectivamente. Para este exemplo, restrinja o lado esquerdo da imagem2 com o lado direito do widget Espaço e o lado superior da imagem2 com o lado inferior do widget Espaço. Isso vinculará image2 ao widget Space e, como o widget Space é restrito de todos os lados, podemos definir a polarização horizontal ou vertical necessária que moverá a image2 conforme necessário.
Além disso, para posicionar a imagem2 na parte inferior central da imagem1, podemos restringir os lados esquerdo e direito da imagem2 com os lados esquerdo e direito do widget Espaço, respectivamente. Da mesma forma, podemos colocar image2 em qualquer lugar alterando as restrições de image2 com o widget Space.
fonte
Eu encontrei uma maneira de fazer isso muito mais simples.
Basicamente, tenha o ImageView e, em seguida, em Text View adicione a restrição superior para corresponder à restrição superior da imagem e apenas adicione a margem superior do TextView para corresponder para obter o comportamento do tipo de margem -ve.
fonte
Isso vai ajudar muitos
No meu caso, quero meu design assim:
Significa que eu quero que minha imagem exiba metade de sua largura, então basicamente preciso de uma margem negativa da metade da largura real da imagem, mas meu layout inteiro no layout de restrição e no layout de restrição não permite margem negativa, então consegui isso com o código abaixo
Assim, o ImageView terminará no início da diretriz. e o efeito é igual à margem negativa no início de 50 dp.
E também se a largura da sua visão não for fixa e estiver em porcentagem, para que você possa colocar a linha de orientação com porcentagem e obter o efeito que deseja
Happy Coding :)
fonte
Você só precisa usar o widget Space em seu layout
fonte
Esta é uma pergunta antiga, mas muito questionada, a maneira mais rápida de conseguir isso é restringindo a parte superior e inferior do lado da vista que você deseja ancorar, assim:
Isso o centralizará na linha inferior da visualização, centralizado horizontalmente.
fonte
Uma maneira simples.
Não tenho certeza da melhor maneira.
Apenas envolva usando LinearLayout
fonte