No Android, um ImageView é um retângulo por padrão. Como faço para torná-lo um retângulo arredondado (recorte todos os quatro cantos do meu Bitmap para serem retângulos arredondados) no ImageView?
573
No Android, um ImageView é um retângulo por padrão. Como faço para torná-lo um retângulo arredondado (recorte todos os quatro cantos do meu Bitmap para serem retângulos arredondados) no ImageView?
ShapeableImageView
que fazer uma imagem circular ou arredondadaView stackoverflow.com/a/61086632/7666442Respostas:
Isso é bastante tardio em resposta, mas para qualquer pessoa que esteja procurando por isso, você pode fazer o seguinte código para arredondar manualmente os cantos das suas imagens.
http://www.ruibm.com/?p=184
Este não é o meu código, mas eu o usei e funciona maravilhosamente. Usei-o como auxiliar dentro de uma classe ImageHelper e estendi-o um pouco para passar a quantidade de difusão necessária para uma determinada imagem.
O código final fica assim:
Espero que isso ajude alguém!
fonte
Enquanto a resposta acima funciona, Romain Guy (um desenvolvedor central do Android) mostra um método melhor em seu blog que usa menos memória usando um sombreador que não cria uma cópia do bitmap. A essência geral da funcionalidade está aqui:
As vantagens disso sobre outros métodos é que:
Eu criei um RoundedImageView com base nesse código que agrupa essa lógica em um ImageView e adiciona
ScaleType
suporte adequado e uma borda arredondada opcional.fonte
/ example / res / layout / rounded_item.xml
por que você especifica uma imagem src quando todas as suas fontes são codificadas? Boa demonstração, um exagero.Outra maneira fácil é usar um CardView com o raio do canto e um ImageView dentro:
fonte
O recorte para formas arredondadas foi adicionado à
View
classe na API 21.Apenas faça o seguinte:
res / drawable / round_outline.xml
android:background="@drawable/round_outline"
android:clipToOutline="true"
Infelizmente, há um erro e esse atributo XML não é reconhecido. Felizmente, ainda podemos configurar o recorte em Java:
ImageView.setClipToOutline(true)
Aqui está como será:
Nota:
Este método funciona para qualquer forma desenhável (não apenas arredondada). Ele recortará o ImageView no contorno de forma que você definiu no seu xml Drawable.
Nota especial sobre o ImageViews
setClipToOutline()
só funciona quando o plano de fundo da vista é definido como uma forma desenhável. Se essa forma de plano de fundo existir, o View tratará o contorno da forma como as bordas para fins de recorte e sombreamento.Isso significa que, se você deseja usar
setClipToOutline()
para arredondar os cantos em um ImageView, sua imagem deve ser definida usando emandroid:src
vez deandroid:background
(já que o plano de fundo deve ser definido como sua forma arredondada). Se você DEVE usar o plano de fundo para definir sua imagem em vez de src, pode usar esta solução alternativa:fonte
android:clipToOutline
, é preciso usarandroid:outlineProvider="background"
.Na v21 da biblioteca de Suporte, agora existe uma solução para isso: ela se chama RoundedBitmapDrawable .
É basicamente como um Drawable normal, exceto que você fornece um raio de canto para o recorte com:
Então, começando com
Bitmap src
e um alvoImageView
, seria algo como isto:fonte
android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory
assimv4
também suporta.v4
biblioteca de apoio, mas não atéREVISION 21
da biblioteca de suportescaleType
centerCrop
(biblioteca de suporte v25.3.1)Eu fiz pelo Custom ImageView:
Como usar:
Resultado:
Espero que isto te possa ajudar.
fonte
Canvas.clipPath()
pode causarjava.lang.UnsupportedOperationException
em alguns casos. Veja stackoverflow.com/questions/13248904/…android:background
, mas nãoandroid:src
.Uma solução xml rápida -
Você pode definir a largura, altura e raio desejados no CardView e scaleType no ImageView.
Com o AndroidX, use
<androidx.cardview.widget.CardView>
fonte
scaleType="fitXY"
e não parece adequada @ThemBonesEu descobri que ambos os métodos eram muito úteis para encontrar uma solução funcional. Aqui está minha versão composta, que é independente de pixels e permite que você tenha alguns cantos quadrados, com o restante dos cantos tendo o mesmo raio (que é o caso de uso usual). Agradecemos às duas soluções acima:
Além disso, eu substituí o ImageView para colocar isso para que eu pudesse defini-lo em xml. Você pode adicionar algumas das lógicas que a chamada super faz aqui, mas eu as comentei, pois não é útil no meu caso.
Espero que isto ajude!
fonte
Imagem arredondada Usando
ImageLoader
aquiCriar
DisplayImageOptions
:Ou você pode usar a
Picasso
Biblioteca da Square.você pode baixar o arquivo RoundedTransformation aqui aqui
fonte
Como todas as respostas me pareciam muito complicadas apenas para os cantos arredondados, pensei e cheguei a outra solução que acho que vale a pena compartilhar, apenas com XML, caso você tenha algum espaço em torno da imagem:
Crie uma forma com borda com conteúdo transparente como este:
Em um RelativeLayout, você pode primeiro colocar sua imagem e, em seguida, no mesmo local acima da forma com outro ImageView. A forma da capa deve ser maior em tamanho pela quantidade da largura da borda. Tenha cuidado com um raio de canto maior, pois o raio externo é definido, mas o raio interno é o que cobre sua imagem.
Espero que ajude alguém também.
Edite conforme a solicitação do CQM o exemplo de layout relativo:
fonte
Começando com a versão
1.2.0-alpha03
da Biblioteca de componentes de materiais, há o novoShapeableImageView
.Você pode usar algo como:
com:
Ou programaticamente:
fonte
Minha implementação do ImageView com widget de cantos arredondados, que (para baixo || para cima) dimensiona a imagem para as dimensões necessárias. Ele utiliza o formulário de código CaspNZ.
fonte
Recentemente, existe outra maneira - usar a API Gerada da Glide . É preciso algum trabalho inicial, mas, em seguida, oferece todo o poder do Glide com a flexibilidade de fazer qualquer coisa, porque você escreve o código real, então acho que é uma boa solução a longo prazo. Além disso, o uso é muito simples e arrumado.
Primeiro, configure o Glide versão 4+:
Em seguida, crie a classe do módulo de aplicativo do Glid para acionar o processamento da anotação:
Em seguida, crie a extensão Glide, que realmente faz o trabalho. Você pode personalizá-lo para fazer o que quiser:
Depois de adicionar esses arquivos, crie seu projeto.
Em seguida, use-o no seu código assim:
fonte
RequestOptions
eoptions
em params@GlideExtension
classe anotada e apenas segui.transform(new RoundedCorners(px))
ondepx
é o mesmo (int px = Math.round(cornerRadius * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT));
).Existe uma biblioteca interessante que permite moldar visualizações de imagens.
Aqui está um exemplo:
Definição da forma:
Resultado:
fonte
Aqui está um exemplo simples de substituição do imageView; você também pode usá-lo no designer de layout para visualizar.
Isto é para solução rápida. O raio é usado em todos os cantos e baseia-se na porcentagem da largura do bitmap.
Acabei de substituir
setImageDrawable
e usei o método support v4 para desenhar bitmap arredondado.Uso:
Visualização com imageView e imageView personalizado:
fonte
Você deve estender
ImageView
e desenhar seu próprio retângulo arredondado.Se você deseja um quadro ao redor da imagem, também pode sobrepor o quadro arredondado na parte superior da visualização da imagem no layout.
[editar] Sobreponha o quadro à imagem original, usando a,
FrameLayout
por exemplo. O primeiro elemento doFrameLayout
será a imagem que você deseja exibir arredondada. Em seguida, adicione outroImageView
com o quadro. O segundoImageView
será exibido em cima do originalImageView
e, portanto, o Android desenhará seu conteúdo acima do originalImageView
.fonte
FrameLayout
coloque umImageView
nele e adicione outroImageView
com o quadro arredondado. Dessa forma, a primeiraImageView
exibirá a imagem selecionada e a segundaImageFrame
exibirá o quadro arredondado.Romain Guy é onde está.
Versão reduzida da seguinte forma.
fonte
Esta solução xml pura foi boa o suficiente no meu caso. http://www.techrepublic.com/article/pro-tip-round-corners-on-an-android-imageview-with-this-hack/
EDITAR
Aqui está a resposta em poucas palavras:
Na pasta / res / drawable, crie um arquivo frame.xml. Nele, definimos um retângulo simples com cantos arredondados e um centro transparente .
No seu arquivo de layout, você adiciona um LinearLayout que contém um ImageView padrão, bem como um FrameLayout aninhado. O FrameLayout usa preenchimento e a gaveta personalizada para dar a ilusão de cantos arredondados.
fonte
Adereços para George Walters II acima, eu apenas peguei a resposta dele e a estendi um pouco para apoiar as curvas individuais de maneira diferente. Isso pode ser otimizado um pouco mais (alguns dos rects de destino se sobrepõem), mas não muito.
Sei que esse tópico é um pouco antigo, mas é um dos principais resultados de consultas no Google sobre como arredondar os cantos do ImageViews no Android.
fonte
Aplique uma forma ao seu
imageView
como abaixo:pode ser útil para você amigo.
fonte
Por que não recortar
draw()
?Aqui está a minha solução:
Código:
fonte
A seguir, cria um objeto de layout de retângulo arredondado que desenha um retângulo arredondado em torno de qualquer objeto filho que é colocado nele. Também demonstra como criar visualizações e layouts programaticamente sem usar os arquivos xml de layout.
A classe para o objeto de layout RoundedRectangle é como definida aqui:
fonte
Kotlin
Para fazer
ImageView
circular, podemos mudarcornerRadius
com:fonte
Muito obrigado à primeira resposta. Aqui está a versão modificada para converter uma imagem retangular em quadrada (e arredondada) e a cor do preenchimento está sendo passada como parâmetro.
fonte
Se você estiver usando a Biblioteca Glide, isso seria útil:
fonte
se sua imagem estiver na internet, a melhor maneira é usar o glide e
RoundedBitmapDrawableFactory
(da API 21 - mas disponível na biblioteca de suporte) assim:fonte
centerCrop
você pode usar apenas
ImageView
no layout e no usoglide
, pode aplicar cantos arredondados usando esse método.primeiro na sua escrita gradle,
para imagem com cantos arredondados,
método de chamada:
fonte
ImageView
.Responda à pergunta que é redirecionada aqui: "Como criar um ImageView circular no Android?"
fonte
Com a ajuda da biblioteca glide e da classe RoundedBitmapDrawableFactory , é fácil de obter. Pode ser necessário criar uma imagem de espaço reservado circular.
fonte
Para aqueles que usam Glide e Kotlin, você pode conseguir isso estendendo
RequestBuilder
e use como;
fonte
roundCorners
como acima? @ Dr.aNdRO