2012-01-19 13 views
96

que tenía esta dibujable tener un rectángulo redondeado como fondo:Android - Disponibles con esquinas redondeadas en la parte superior solamente

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:radius="6dp" /> 
</shape> 

Esto está funcionando bien, como se esperaba.

Ahora, yo quiero cambiar esto a solamente alrededor de las esquinas superiores, por lo que cambiar a esto:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/white" /> 
    <stroke android:width="1dp" android:color="@color/light_gray" /> 
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> 
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp" 
      android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/> 
</shape> 

Pero ahora ninguna de las esquinas son redondeadas y me da un rectángulo normal. ¿Que me estoy perdiendo aqui?

+0

Esto realmente no es una solución, pero creo que una vez tuve un problema similar. Aumentar el Stoke a 2 píxeles ayudó, pero ya sabes, esa no es una solución. –

+0

Aquí hay un problema con las esquinas de formas: http://code.google.com/p/android/issues/detail?id = 939 – Knickedi

Respuesta

191

tratar de darle a estos valores:

<corners android:topLeftRadius="6dp" android:topRightRadius="6dp" 
     android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/> 

Tenga en cuenta que he cambiado 0dp-0.1dp.

EDIT: Véase el comentario de Alex abajo por la versión más limpia

+95

Explorando esto aún más, encontré una solución aún mejor: ' '- esto produce esquinas de fondo perfectamente cuadradas sin siquiera un toque de redondeo. Sin embargo, tu solución funciona bastante. –

+1

@AleksG genial !! – aqs

+0

¿Cómo hacerlo en código, dado un mapa de bits? ¿Y cómo agregar el contorno (AKA stroke) a su alrededor? –

2

he intentado su código. Tengo un botón de esquina superior redondeado. di los colores como @ffffff y srtoke di # C0C0C0. intente 1) dando android: bottomLeftRadius = "0.1dp" en vez de 0. si no funciona 2) compruebe qué resolución dibuja y emuladores. Creé una carpeta dibujable debajo de res y usándola. (hdpi, mdpi ldpi) carpeta tiene este xml. esta es mi ouput

enter image description here

+0

¿Qué versión de Android es esta? Mi aplicación debe ejecutarse en 1.6 y el emulador 1.6 tuvo el problema. –

+0

intenté con Android 2.1 y 2.3 – AD14

11

tratar de hacer algo como esto:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:bottom="-20dp" android:left="-20dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 

      <corners android:radius="20dp" /> 
     </shape> 
    </item> 
</layer-list> 

Parece no adecuada para establecer un radio de esquina diferente del rectángulo. Entonces puedes usar este truco.

+0

Ver mi propia respuesta: es perfectamente aceptable tener diferentes radios para diferentes rincones. –

+0

Probé este enfoque, no es aceptable, ide dice que no se apropia de tener diferentes rsdius y lo ignora – busylee

+0

sí mismo aquí no permite diferentes radios ... – bvsss

7

Sobre la base de busylee's answer, se trata de cómo se puede hacer una drawable que sólo tiene una ONU esquina redondeada (-izquierda arriba, en este ejemplo):

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
      <!-- A numeric value is specified in "radius" for demonstrative purposes only, 
        it should be @dimen/val_name --> 
      <corners android:radius="10dp" /> 
     </shape> 
    </item> 
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): --> 
    <item 
     android:bottom="10dp" 
     android:right="10dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
     </shape> 
    </item> 
</layer-list> 

Tenga en cuenta que lo anterior drawable es no se muestra correctamente en la vista previa de Android Studio (2.0.0p7). Para obtener una vista previa de todos modos, crea otra vista y úsala como android:background="@drawable/...".

+0

Gracias. ¿Te das cuenta de que esta pregunta tiene 4 años y la solución se encontró hace 4 años? –

+6

@AleksG - Por supuesto. Es relevante hoy como lo era entonces (como evidencia, necesitaba algo así). Debe saber que a lo largo de los años algunas formas de hacer las cosas se vuelven obsoletas y es posible que deban reemplazarse por otras más modernas. Como se mencionó ** busylee **, el IDE se queja cuando se definen diferentes radios de esquina, que no es el caso con el presente método. Además, como esta pregunta fue mi primer éxito en Google (iirc), tenía sentido que la actualizara. De todos modos, estoy seguro de que a SO no le importará unos KB más de código ... :) –

3

En mi caso, por debajo de código

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

     <shape android:shape="rectangle"> 
      <solid android:color="@color/maincolor" /> 

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

    </item> 
    </layer-list> 
+0

Las propiedades superiores e inferiores del elemento no son necesarias a menos que desee un relleno en la vista, pero de lo contrario, esto funciona. – RominaV

1

Es posible que necesite leer este https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

y por debajo hay una nota.

Nota Cada esquina debe tener (inicialmente) un radio de esquina mayor que 1, o bien no se redondean las esquinas. Si desea que las esquinas específicas no se redondeen, una solución alternativa es usar android: radius para establecer un radio de esquina predeterminado mayor que 1, pero luego anular cada esquina con los valores que realmente desea, proporcionando cero ("0dp") donde no quieres esquinas redondeadas.

Cuestiones relacionadas