Estou tentando fazer uma visualização no android com bordas arredondadas. A solução que encontrei até agora é definir uma forma com cantos arredondados e usá-la como plano de fundo dessa vista.
Aqui está o que eu fiz, defina um drawable conforme mostrado abaixo:
<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>
Agora eu usei isso como plano de fundo para meu layout conforme abaixo:
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:clipChildren="true"
android:background="@drawable/rounded_corner">
Isso funciona perfeitamente bem, posso ver que a visualização tem bordas arredondadas.
Mas meu layout tem muitas outras visualizações filho, digamos um ImageView ou a MapView
. Quando coloco um ImageView
dentro do layout acima, os cantos da imagem não são cortados / cortados, em vez disso, ela parece cheia.
Eu vi outras soluções alternativas para fazê-lo funcionar como o explicado aqui .
Mas existe um método para definir cantos arredondados para uma visualização e todas as visualizações filhas estão contidas na visualização principal que possui cantos arredondados?
Respostas:
Outra abordagem é fazer uma classe de layout personalizada como a abaixo. Esse layout primeiro desenha seu conteúdo em um bitmap fora da tela, mascara o bitmap fora da tela com um retângulo arredondado e, em seguida, desenha o bitmap fora da tela na tela real.
Eu tentei e parece funcionar (pelo menos para o meu caso de teste simples). É claro que afetará o desempenho em comparação com um layout regular.
Use como um layout normal:
fonte
Ou você pode usar um
android.support.v7.widget.CardView
assim:fonte
shape.xml
e dentro do seu layout
fonte
A resposta de Jaap van Hengstum funciona muito bem, entretanto eu acho que é caro e se aplicarmos esse método em um botão, por exemplo, o efeito de toque é perdido, pois a visualização é renderizada como um bitmap.
Para mim o melhor método e o mais simples consiste em aplicar uma máscara na vista, assim:
fonte
Se você estiver tendo problemas ao adicionar ouvintes de toque ao layout. Use este layout como layout pai.
Como
fonte
Crie um arquivo xml chamado
round.xml
nadrawable
pasta e cole este conteúdo:em seguida, use
round.xml
comobackground
para qualquer item. Em seguida, você terá cantos arredondados.fonte
No Android L, você poderá usar apenas View.setClipToOutline para obter esse efeito. Nas versões anteriores, não havia como apenas cortar o conteúdo de um ViewGroup aleatório em uma determinada forma.
Você terá que pensar em algo que lhe daria um efeito semelhante:
Se você só precisa de cantos arredondados no ImageView, pode usar um sombreador para 'pintar' a imagem sobre a forma que está usando como plano de fundo. Dê uma olhada nesta biblioteca para obter um exemplo.
Se você realmente precisa que todos os filhos sejam cortados, talvez possa outra visão sobre o seu layout? Um com um fundo da cor que você está usando e um 'buraco' redondo no meio? Na verdade, você poderia criar um ViewGroup personalizado que desenhasse essa forma sobre todos os filhos, substituindo o método onDraw.
fonte
siga este tutorial e toda a discussão abaixo dele - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
de acordo com este post escrito por Guy Romain, um dos desenvolvedores líderes de todo o kit de ferramentas de IU do Android, é possível fazer um contêiner (e todas as suas visualizações filhas) com cantos arredondados, mas ele explicou que é muito caro (devido ao desempenho de problemas de renderização).
Eu recomendo que você vá de acordo com o post dele, e se você quiser cantos arredondados, implemente os cantos arredondados de
ImageView
acordo com este post. em seguida, você pode colocá-lo dentro de um recipiente com qualquer plano de fundo e obterá o efeito que deseja.foi o que eu também fiz eventualmente.
fonte
Você pode usar um
androidx.cardview.widget.CardView
assim:OU
shape.xml
e dentro do seu layout
fonte
Crie um arquivo xml em sua pasta drawable com o código a seguir. (O nome do arquivo que criei é rounded_corner.xml)
rounded_corner.xml
E mantenha isso
drawable
comobackground
para a vista para a qual você deseja manter a borda do canto arredondado. Vamos mantê-lo por umLinearLayout
fonte
O
CardView
trabalhou para mim em API 27 em Android Estúdio 3.0.1. OcolorPrimary
foi referenciado nores/values/colors.xml
arquivo e é apenas um exemplo. Para o layout_width,0dp
ele se estenderá até a largura do pai. Você terá que configurar as restrições e largura / altura de acordo com suas necessidades.fonte
Diferença da resposta de Jaap van Hengstum:
fonte
fonte
Com a Biblioteca de Componentes de Materiais, a melhor maneira de fazer um
View
com cantos arredondados é usar oMaterialShapeDrawable
.Crie um ShapeAppearanceModel com cantos arredondados personalizados:
Crie um
MaterialShapeDrawable
:Se você quiser aplicar também um elevationOverlay para o tema escuro, use isto:
Opcional: aplique ao shapeDrawable uma cor de fundo e um traço
Por fim, aplique o shapeDrawable como plano de fundo em sua
LinearLayout
(ou em outra visualização):fonte
O link do tutorial que você forneceu parece sugerir que você precisa definir as propriedades layout_width e layout_height dos seus elementos filhos para match_parent.
fonte
experimente esta propriedade com seu layout linear. Isso ajudará nas
ferramentas: context = ". youractivity"
fonte
fonte
Para criar uma imagem de canto arredondado usando com.google.android.material: material: 1.2.0-beta01
ou se quiser usá-lo em um arquivo xml:
em style.xml adicione isto:
fonte
Use forma em xml com retângulo. Defina a propriedade de raio inferior ou superior como desejado. Em seguida, aplique esse xml como plano de fundo para sua visualização .... ou ... use gradientes para fazer isso a partir do código.
fonte