Quero baixar uma imagem (de tamanho desconhecido, mas que é sempre quase quadrada) e exibi-la de forma que preencha a tela horizontalmente e estique-a verticalmente para manter a proporção da imagem, em qualquer tamanho de tela. Aqui está meu código (não funcional). Estica a imagem horizontalmente, mas não verticalmente, por isso é comprimida ...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Respostas:
Eu fiz isso com uma visão personalizada. Defina layout_width = "fill_parent" e layout_height = "wrap_content" e aponte para o drawable apropriado:
fonte
No final, gerei as dimensões manualmente, o que funciona muito bem:
fonte
Acabei de ler o código-fonte para
ImageView
e é basicamente impossível sem usar as soluções de subclasse neste segmento. EmImageView.onMeasure
chegarmos a estas linhas:Onde
h
ew
estão as dimensões da imagem, ep*
é o preenchimento.E depois:
Então se você tem um
layout_height="wrap_content"
ele vai definirwidthSize = w + pleft + pright
, ou seja, a largura máxima é igual à largura da imagem.Isso significa que, a menos que você defina um tamanho exato, as imagens NUNCA serão ampliadas . Eu considero isso um bug, mas boa sorte para que o Google o perceba ou corrija. Edit: comendo minhas próprias palavras, enviei um relatório de bug e eles dizem que foi corrigido em uma versão futura!
Outra solução
Aqui está outra solução alternativa com subclasse, mas você deve (em teoria, eu realmente não testei muito!) Ser capaz de usá-la em qualquer lugar
ImageView
. Para usá-lolayout_width="match_parent"
, defina elayout_height="wrap_content"
. É também muito mais geral do que a solução aceita. Por exemplo, você pode ajustar à altura, bem como ajustar à largura.fonte
Configurar o AdjustViewBounds como true e usar um grupo de visualização LinearLayout funcionou muito bem para mim. Não há necessidade de criar subclasses ou pedir métricas de dispositivo:
fonte
Tenho lutado com esse problema de uma forma ou de outra por IDADES, obrigado, obrigado, obrigado .... :)
Eu só queria salientar que você pode obter uma solução generalizável a partir do que Bob Lee fez apenas estendendo View e substituindo onMeasure. Dessa forma, você pode usar isso com qualquer drawable que desejar e ele não quebrará se não houver imagem:
fonte
Em alguns casos, essa fórmula mágica resolve perfeitamente o problema.
Para quem está lutando com isso vindo de outra plataforma, o "tamanho e forma para caber" é tratada perfeitamente no Android, mas é difícil de encontrar.
Você normalmente deseja esta combinação:
Então é automático e incrível.
Se você é um desenvolvedor iOS, é absolutamente incrível como, no Android, você pode fazer "alturas de células totalmente dinâmicas" em uma exibição de tabela ... err, quero dizer ListView. Aproveitar.
fonte
Consegui fazer isso usando apenas este código XML. Pode ser que o eclipse não renderize a altura para mostrá-la se expandindo para caber; entretanto, quando você realmente executa isso em um dispositivo, ele renderiza corretamente e fornece o resultado desejado. (Bem, pelo menos para mim)
fonte
src
e ImageView tornou-se proporcional.Fiz isso com estes valores em um LinearLayout:
fonte
Todos estão fazendo isso de maneira programática, então achei que essa resposta se encaixaria perfeitamente aqui. Este código funcionou para mim no xml. Ainda NÃO estou pensando na proporção, mas ainda assim gostaria de colocar esta resposta se isso ajudasse alguém.
Felicidades..
fonte
Uma solução muito simples é apenas usar os recursos fornecidos por
RelativeLayout
.Aqui está o xml que torna isso possível com o Android padrão
Views
:O truque é definir o
ImageView
para preencher a tela, mas deve estar acima dos outros layouts. Desta forma, você consegue tudo o que precisa.fonte
É simples questão de configurar
adjustViewBounds="true"
escaleType="fitCenter"
no arquivo XML para o ImageView!Nota:
layout_width
está definido paramatch_parent
fonte
Você está definindo ScaleType como ScaleType.FIT_XY. De acordo com os javadocs , isso esticará a imagem para caber em toda a área, alterando a proporção da imagem se necessário. Isso explicaria o comportamento que você está vendo.
Para obter o comportamento que você deseja ... FIT_CENTER, FIT_START ou FIT_END estão próximos, mas se a imagem for mais estreita do que alta, ela não começará a preencher a largura. Você pode ver como eles são implementados e provavelmente será capaz de descobrir como ajustá-los para seu propósito.
fonte
ScaleType.CENTER_CROP fará o que você quiser: esticar até a largura total e dimensionar a altura de acordo. se a altura dimensionada exceder os limites da tela, a imagem será cortada.
fonte
Veja, há uma solução muito mais fácil para o seu problema:
fonte
Você pode usar meu StretchableImageView preservando a proporção (por largura ou altura) dependendo da largura e altura do drawable:
fonte
Para mim, o android: scaleType = "centerCrop" não resolveu meu problema. Na verdade, expandiu a imagem muito mais. Tentei com android: scaleType = "fitXY" e funcionou perfeitamente.
fonte
Isso está funcionando bem de acordo com minha exigência
<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>
fonte