Círculo transparente con borde

83

Estoy tratando de crear un círculo con solo un borde usando XML en Android:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >

<stroke android:width="1dp"
    android:color="#000000"/>

</shape>

El código que he usado está publicado arriba. Sin embargo, obtengo un disco sólido y no un anillo. Me gustaría obtener la salida usando solo XML y no lienzo. ¿Qué estoy haciendo mal?

Gracias.

EDITAR: Lo hice funcionar gracias a la respuesta a continuación. Aquí está mi código final:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="1.9"
    android:useLevel="false" >

    <solid android:color="@android:color/transparent" />

    <size android:width="100dp"
     android:height="100dp"/>

    <stroke android:width="1dp"
    android:color="#FFFFFF"/>

</shape>
Anirudh
fuente

Respuestas:

186

Prueba algo como esto

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadius="0dp"
    android:shape="ring"
    android:thicknessRatio="2"
    android:useLevel="false" >
    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="2dp"
        android:color="@android:color/darker_gray" />
</shape>

Actualización: hecho android:thicknessRatio="2"para dar un círculo completo (usando Nexus 5 - Lollipop)

stinepike
fuente
7
Hice que android:thicknessRatio="2"fuera un anillo cerrado (Nexus 5, Lollipop)
David
El área fuera del círculo no se muestra transparente para mí.
Paradox
@Paradox prueba la vista de imagen en lugar de botón
Nikunj Patel
1
Funcionó como se esperaba. Mejor respuesta
Muthukumaaran Chandramohan
33

usa esto, funcionará

<?xml version="1.0" encoding="utf-8"?>  
     <shape xmlns:android="http://schemas.android.com/apk/res/android"                                                                                                                                                     
   android:shape="oval" >

<gradient
    android:centerX=".6"
    android:centerY=".40"
    android:endColor="@android:color/transparent"
    android:gradientRadius="20"
    android:startColor="@android:color/transparent"
    android:type="radial" />

<stroke
    android:width="1dp"
    android:color="#FFFFFF" />

<size
    android:height="100dp"
    android:width="100dp" />

</shape>
anupam sharma
fuente
13

Hueco

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <stroke
            android:width="1dp"
            android:color="@color/indicator_unselected" />
    </shape>

Lleno

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <corners android:radius="100dp" />
    <solid android:color="@android:color/white" />
</shape>
Hitesh Sahu
fuente
6

El efecto de trazo se puede lograr dibujando un óvalo transparente con el trazo de un color requerido (# 000 en el ejemplo):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@android:color/transparent" />
    <stroke
        android:width="1dp"
        android:color="#000" />
    <size
        android:width="40dp"
        android:height="40dp" />
</shape>
Alex Burov
fuente
3

Si puede usar elementos de diseño vectoriales, pruebe esto

<vector android:height="24dp" android:viewportHeight="512.0"
    android:viewportWidth="512.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#FFFFFF" android:fillType="evenOdd"
        android:pathData="M0,0L512,0L512,512L0,512L0,0ZM256,511C396.8,511 511,396.8 511,256C511,115.2 396.8,1 256,1C115.2,1 1,115.2 1,256C1,396.8 115.2,511 256,511Z"
        android:strokeColor="#00000000" android:strokeWidth="1"/>
</vector>
Héctor
fuente
2

Puede usar el valor incorporado de Android para transparente como @android:color/transparento usar #0000o#00000000

para arriba, el comienzo de 4 dígitos primero fue para alfa y en el valor de 8 dígitos, los primeros dos dígitos fueron para lo mismo que alfa.

Cuando solo da 3 dígitos o 6 dígitos en color, el valor alfa predeterminado fue para usted al pasar un valor de 4 dígitos u 8 dígitos, establezca ese valor alfa de ese valor de color

Pratik
fuente
1
Hola Pratik, no entendí la parte alfa de tu respuesta. Agregué la línea <solid android: color = "# 0000" /> al archivo XML. Pero aún así obtuve el mismo resultado.
Anirudh
este alfa se utilizó para establecer la opacidad del color. Si establece los 4 0 u 8 0, entonces es completamente transparente, con el aumento de los primeros 2 dígitos en el valor de 8 0, eso solo aumenta el valor de opacidad
Pratik
2
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval" >

        <gradient
            android:endColor="@android:color/transparent"
            android:gradientRadius="20"
            android:startColor="@android:color/transparent" />

        <stroke
            android:width="1dp"
            android:color="#d9d9d9" />

        <size
            android:height="100dp"
            android:width="100dp" />
        </shape>
    </item>

    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp">
        <shape android:shape="oval" >

            <gradient
                android:endColor="@android:color/transparent"
                android:gradientRadius="20"
                android:startColor="@android:color/transparent" />

            <stroke
                android:width="1dp"
                android:color="#b3b3b3" />

            <size
                android:height="100dp"
                android:width="100dp" />
        </shape>
    </item>
</layer-list>
Palak Jain
fuente
1
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval" >

            <stroke
                android:width="4dp"
                android:color="@color/colorPrimaryDark" />
            <corners android:radius="0dp" />
        </shape>
    </item>
    <item
        android:top="1dp"
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp">

        <shape android:shape="oval">
            <solid android:color="@color/colorRed" />
            <size android:height="@dimen/_100sdp"
                android:width="@dimen/_100sdp"></size>
        </shape>

    </item>

</layer-list>
Mohsinali
fuente
0

Si establece el color en #00000000, el resultado será transparente. Querría hacerlo de esta manera si quisiera cambiarlo en el futuro del desarrollo. Si quisieras que fuera rojo y parcialmente transparente, por ejemplo, sería #ff000088Los dos últimos números son la opacidad. Lo hago de esta manera para facilitar los cambios futuros.

Jack Papel
fuente
0
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:innerRadiusRatio="2"
     android:shape="ring"
     android:thicknessRatio="1"
     android:useLevel="false">

    <gradient
        android:type="radial"
        android:gradientRadius="8dp"
        android:endColor="@color/colorDarkPurple"
        android:elevation="5dp"
    />

    <stroke
        android:width="2dp"
        android:color="@color/colorLilac"/>
</shape>
Patricia Milou
fuente