Eu tenho uma visualização de imagem. Eu quero que sua largura seja fill_parent. Eu quero que a altura seja a largura que for. Por exemplo:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
É possível algo assim em um arquivo de layout sem precisar criar minha própria classe de exibição?
obrigado
Respostas:
Atualização: 14 de setembro de 2017
De acordo com um comentário abaixo, a porcentagem de biblioteca de suporte está obsoleta a partir da Android Support Library 26.0.0. Esta é a nova maneira de fazer isso:
Veja aqui
Descontinuada:
De acordo com esta postagem dos desenvolvedores do Android, tudo o que você precisa fazer agora é agrupar o que quiser dentro de um PercentRelativeLayout ou um PercentFrameLayout e especificar suas proporções, assim
fonte
Talvez isso responda sua pergunta:
Você pode ignorar o
scaleType
atributo para esta situação específica.fonte
Isso pode ser feito usando o LayoutParams para definir dinamicamente a altura das Views assim que você souber a largura das Views em tempo de execução. Você precisa usar um thread Runnable para obter a largura da Views em tempo de execução, ou então você estará tentando definir a Altura antes de saber a largura da View porque o layout ainda não foi desenhado.
Exemplo de como eu resolvi meu problema:
Os LayoutParams devem ser do tipo da Visualização pai em que sua visualização está. Meu FrameLayout está dentro de um RelativeLayout no arquivo xml.
é chamado para forçar a exibição a redesenhar enquanto estiver em um thread separado do que o thread da interface do usuário
fonte
onMeasure
, como mostra a resposta da Regis . Uma alternativa, mas apenas para visualizações renderizadas através de um adaptador, por exemploGridView
, dentro , é a resposta de Matt .requestLayout()
depois de definir os parâmetros. por que isso seria?Não consegui que a resposta de David Chu funcionasse para um item do RecyclerView e concluí que precisava restringir o ImageView ao pai. Defina a largura do ImageView
0dp
e restrinja seu início e fim ao pai. Não tenho certeza se definir a largura comowrap_content
oumatch_parent
funciona em alguns casos, mas acho que essa é a melhor maneira de fazer com que o filho de um ConstraintLayout preencha seu pai.fonte
Aqui eu o que fiz para ter um ImageButton que sempre tem uma largura igual à sua altura (e evite margens vazias estúpidas em uma direção ... que considero um bug do SDK ...):
Eu defini uma classe SquareImageButton que se estende do ImageButton:
Aqui está o meu xml:
Funciona como um encanto !
fonte
No Android 26.0.0, o PercentRelativeLayout foi descontinuado .
A melhor maneira de resolver isso agora é
ConstraintLayout
assim:Aqui está um tutorial sobre como adicionar
ConstraintLayout
ao seu projeto.fonte
Se a visualização da imagem estiver dentro de um layout de restrição, você poderá usar as seguintes restrições para criar uma visualização quadrada da imagem
fonte
Você não pode fazer isso apenas com o layout, tentei. Acabei escrevendo uma aula muito simples para lidar com isso, você pode conferir no github. SquareImage.java Faz parte de um projeto maior, mas nada que uma pequena cópia e cola não pode consertar (licenciado no Apache 2.0)
Basicamente, você só precisa definir a altura / largura igual à outra dimensão (dependendo da maneira que você deseja dimensioná-la)
Nota: Você pode quadrá-lo sem uma classe personalizada usando o
scaleType
atributo, mas os limites da vista se estendem além da imagem visível, o que torna um problema se você estiver colocando outras vistas perto dele.fonte
Para definir seu ImageView igual à metade da tela, você precisa adicionar o seguinte ao XML para o ImageView:
Para definir a altura igual a essa largura, você precisa fazer isso no código. No
getView
método do seuGridView
adaptador, defina aImageView
altura igual à sua largura medida:fonte
Para as pessoas que passam agora, em 2017, a nova melhor maneira de alcançar o que você deseja é usando o ConstraintLayout assim:
E não se esqueça de adicionar restrições a todas as quatro direções, conforme necessário pelo seu layout.
Crie uma interface de usuário responsiva com ConstraintLayout
Além disso, agora, o PercentRelativeLayout foi descontinuado (consulte a documentação do Android ).
fonte
Aqui está como eu resolvi esse problema:
preview - imageView com largura definida como "match_parent" e scaleType como "cropCenter"
picture - Objeto Bitmap para definir no imageView src.
Isso funciona muito bem para mim.
fonte
= vw*ph/pw
vez do mais simples= vw
. (Eu acho que você fazer isso para preservar a relação de aspecto de imagem de origem de, ao invés da força um preview quadrado.)Acho que não há como você fazer isso no arquivo de layout XML, e não acho que o
android:scaleType
atributo funcione como você deseja.A única maneira seria fazê-lo programaticamente. Você pode definir a largura como fill_parent e pode ter a largura da tela como a altura do método
View
ou pode usarView.getWidth()
.fonte
A função ImageView "scaleType" pode ajudá-lo aqui.
Este código manterá a proporção e posicionará a imagem no topo:
Aqui está um ótimo post mostrando as possibilidades e aparências do uso de scaleType.
ImageView scaleType samples
fonte
eu fiz assim -
fonte