¿Cómo hacer una forma con la esquina redondeada redondeada superior izquierda y la esquina redondeada inferior izquierda?

84

Quiero hacer una forma con la esquina redondeada superior izquierda y la esquina redondeada inferior izquierda:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#555555"/>    

    <stroke android:width="3dp"
            android:color="#555555"
            />

    <padding android:left="1dp"
             android:top="1dp"
             android:right="1dp"
             android:bottom="1dp"
             /> 

    <corners android:bottomRightRadius="0dp" android:bottomLeftRadius="2dp" 
     android:topLeftRadius="2dp" android:topRightRadius="0dp"/> 
</shape>

Pero la forma de arriba no me dio lo que quiero. Me da un rectángulo sin esquinas redondeadas.

user256239
fuente

Respuestas:

62

Parece un error http://code.google.com/p/android/issues/detail?id=939 .

Finalmente tengo que escribir algo como esto:

 <stroke android:width="3dp"
         android:color="#555555"
         />

 <padding android:left="1dp"
          android:top="1dp"
          android:right="1dp"
          android:bottom="1dp"
          /> 

 <corners android:radius="1dp"
  android:bottomRightRadius="2dp" android:bottomLeftRadius="0dp" 
  android:topLeftRadius="2dp" android:topRightRadius="0dp"/> 

Tengo que especificar android: bottomRightRadius = "2dp" para la esquina redondeada inferior izquierda (otro error aquí).

user256239
fuente
1
Sí, puedo confirmar su última declaración / error de que izquierda / derecha está allí. También experimenté lo mismo en mi aplicación. (SDK 2.1). ¿Ya presentó un informe de error en b.android.com o ya se informó allí?
Mathias Conradt
3
Acabo de presentar un error, code.google.com/p/android/issues/detail?id=9161 . Lo triste es que, después de solucionar el error, tengo que cambiar mi código nuevamente :(
user256239
58

Si bien esta pregunta ya ha sido respondida (es un error que hace que bottomLeftRadius y bottomRightRadius se inviertan), el error se ha corregido en Android 3.1 (api nivel 12 - probado en el emulador).

Por lo tanto, para asegurarse de que sus elementos de diseño se vean correctos en todas las plataformas, debe colocar las versiones "corregidas" de los elementos de diseño (es decir, donde los radios inferior izquierdo / derecho son realmente correctos en el xml) en la carpeta res / drawable-v12 de su aplicación. De esta manera, todos los dispositivos que usan una versión de Android> = 12 usarán los archivos de diseño correctos, mientras que los dispositivos que usan versiones anteriores de Android usarán los elementos de diseño de "solución alternativa" que se encuentran en la carpeta res / drawables.

Geoff
fuente
4
Otra opción es utilizar un values/dimens.xmlarchivo predeterminado que contenga los valores bottom_left y bottom_right invertidos, y un values-v12/dimens.xmlarchivo nuevo que tenga los valores correctos . De esa manera, puede mantener una sola versión del archivo XML dibujable y solo se intercambia el valor de la dimensión en función de la versión de la API.
Joe
35

De la documentación :

NOTA: Cada esquina debe tener (inicialmente) un radio de esquina mayor que 1, o de lo contrario no se redondearán las esquinas. Si desea que las esquinas específicas no se redondeen, una solución es usar android: radius para establecer un radio de esquina predeterminado mayor que 1, pero luego anule todas y cada una de las esquinas con los valores que realmente desea, proporcionando cero ("0dp" ) donde no desea esquinas redondeadas.

Por ejemplo, tienes que configurar un android:radius="<bigger than 1dp>"para poder hacer lo que quieras:

<corners 
    android:radius="2dp"
    android:bottomRightRadius="0dp" 
    android:topRightRadius="0dp"/> 
Entreco
fuente
14

También puede utilizar números extremadamente pequeños para su radio '.

<corners 
  android:bottomRightRadius="0.1dp" android:bottomLeftRadius="2dp" 
 android:topLeftRadius="2dp" android:topRightRadius="0.1dp" />
Moncader
fuente
esa fue la primera que intenté ... pero no hay esperanza ... estoy probando en Android 2.2 ... Alguna otra idea ... Gracias
Aamir Shah
12

para otros, hay una solución para cualquier nivel de API, puede colocar un elemento encima de otro ejemplo:

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

<!-- my firt item with 4 corners radius(8dp)
 -->
    <item>
        <shape>
            <solid
                android:angle="270.0"
                android:color="#3D689A" />

            <corners android:topLeftRadius="8dp" />
        </shape>
    </item>
<!-- my second item is on top right for a fake corner radius(0dp)
 -->
    <item
        android:bottom="30dp"
        android:left="50dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>
<!-- my third item is on bottom left for a fake corner radius(0dp)
 -->
    <item
        android:right="50dp"
        android:top="30dp">
        <shape>
            <solid android:color="#5C83AF" />
        </shape>
    </item>

</layer-list>

el resultado con color claro para mostrarte los tres elementos:

ingrese la descripción de la imagen aquí

el resultado final :

ingrese la descripción de la imagen aquí

Atentamente.

Williams
fuente
8

Este error está archivado aquí . Este es un error de los dispositivos Android que tienen un nivel de API inferior a 12. Debe poner las versiones correctas de sus diseños en la carpeta drawable-v12 que se utilizará para el nivel de API 12 o superior. Y una versión errónea (esquinas cambiadas / invertidas) del mismo diseño se colocará en la carpeta de diseño predeterminada que utilizarán los dispositivos que tengan un nivel de API inferior a 12.

Por ejemplo: tuve que diseñar un botón con una esquina redondeada en la parte inferior derecha.

En la carpeta 'dibujable' - button.xml: tuve que redondear la esquina inferior izquierda.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>

En la carpeta 'drawable-v12' - button.xml: aquí se colocó la versión correcta del diseño para su uso en el nivel de API 12 o superior.

<shape>
    <corners android:bottomLeftRadius="15dp"/>
</shape>
Reaz Murió
fuente
7

prueba esto

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/upkia"/>
<corners android:radius="10dp"
    android:topRightRadius="0dp"
    android:bottomRightRadius="0dp" />
</shape>
Sai Gopi Me
fuente