¿Cómo configuro el radio de la esquina redondeada de un color que se puede dibujar usando xml?


108

En el sitio web de Android, hay una sección sobre elementos de diseño en color . La definición de estos elementos de diseño en xml se ve así:

<resources>
    <drawable name="solid_red">#f00</drawable>
    <drawable name="solid_blue">#0000ff</drawable>
    <drawable name="solid_green">#f0f0</drawable>
</resources>

En la API de Java, tienen el siguiente método para definir esquinas redondeadas:

setCornerRadius(float radius)

¿Hay alguna forma de establecer las esquinas redondeadas en el xml?


Para establecer esquinas desde el código, consulte (Gradient Drawables): stackoverflow.com/questions/8709595/…
samis

Respuestas:


319

Utilice la <shape>etiqueta para crear un elemento de diseño en XML con esquinas redondeadas. (También puede hacer otras cosas con la etiqueta de forma, como definir un degradado de color).

Aquí hay una copia de un archivo XML que estoy usando en una de mis aplicaciones para crear un dibujo con un fondo blanco, borde negro y esquinas redondeadas:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#ffffffff"/>    
             
    <stroke android:width="3dp"
            android:color="#ff000000" />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp" /> 
             
    <corners android:radius="7dp" /> 
</shape>

1
¿Dónde guardar este archivo y cómo obtenerlo en mi código java? Gracias
shyam

7
guárdelo como un archivo xml en el directorio dibujable, luego úselo como usaría cualquier elemento dibujable (icono o archivo de recursos) usando su nombre de recurso (R.drawable.your_xml_name)
Guillaume

30
en este caso particular, todos los radios son iguales, por lo que podría haber usado android: radius = "7dp"
Will Kru

2
Además, el procesador de diseño en Android Studio no podrá procesarlo si define el radio por separado (incluso con los mismos valores) y le daría una advertencia "Pat.isConvex no es compatible". Solo usa <esquinas android: radius = "7dp" />
Francesco Ambrosini

@shyam Puede configurarlo como "fondo". Si lo usa en un TextView, deberá recordar agregar relleno para el inicio y el final para que el texto no se
acumule

19

La respuesta de mbaird funciona bien. Solo tenga en cuenta que parece haber un error en Android (2.1 al menos), que si establece el radio de una esquina individual en 0, fuerza todas las esquinas a 0 (al menos ese es el caso con las unidades "dp"; yo no probarlo con otras unidades).

Necesitaba una forma en la que las esquinas superiores estuvieran redondeadas y las esquinas inferiores cuadradas. Logré esto configurando las esquinas que quería cuadrar a un valor ligeramente mayor que 0: 0.1dp. Esto todavía se representa como esquinas cuadradas, pero no obliga a las otras esquinas a tener un radio de 0.


¿acabas de escribir 0,1 dp? ¿Funciona? También necesito esquinas superiores redondeadas y cuadradas inferiores, el mismo problema que acabo de usar 1 dp, en las esquinas cuadradas y 10 dp en las redondas, tienes razón, todavía se nota, pero me da el 90% de lo que desee, de acuerdo con la configuración de la documentación 0 en las esquinas sin redondear debería haber funcionado.
codeScriber

En realidad, no es un error, está en la documentación: developer.android.com/guide/topics/resources/…
Tsuharesu

1

Prueba el siguiente código

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:bottomLeftRadius="30dp"
    android:bottomRightRadius="30dp"
    android:topLeftRadius="30dp"
    android:topRightRadius="30dp" />
<solid android:color="#1271BB" />

<stroke
    android:width="5dp"
    android:color="#1271BB" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" /></shape>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.