Cómo crear mediante programación un borde arrinconado redondeado con ShapeDrawable en android?

Necesito crear un borde con las esquinas redondeadas programatically extendiendo ShapeDrawable. Necesito tener un borde negro con las esquinas redondeadas con los pixeles en el exterior que es blanco y los pixeles internos que son transparentes. El código que tengo en este momento tiene múltiples problemas, de los cuales son que no crea una esquina lisa que es el mismo grosor que el borde y que los píxeles externos del borde son transparentes y no blancos.

Aquí está una imagen de las esquinas que estoy recibiendo actualmente esquina

Aquí está el código en el que paso Color.TRANSPARENT para 'fill' en el constructor:

public class CustomShape extends ShapeDrawable { private final Paint fillpaint, strokepaint; public CustomShape(int fill, int strokeWidth,int radius) { super(new RoundRectShape(new float[] { radius, radius, radius, radius, radius, radius, radius, radius }, null, null)); fillpaint = new Paint(this.getPaint()); fillpaint.setColor(fill); strokepaint = new Paint(fillpaint); strokepaint.setStyle(Paint.Style.STROKE); strokepaint.setStrokeWidth(strokeWidth); strokepaint.setColor(Color.BLACK); } @Override protected void onDraw(Shape shape, Canvas canvas, Paint paint) { shape.draw(canvas, fillpaint); shape.draw(canvas, strokepaint); } 

}

Si necesita esquinas redondeadas (y de su ejemplo parece que lo hace) simplemente puede utilizar GradentDrawable con un color sólido

 GradientDrawable gd = new GradientDrawable(); gd.setColor(Color.RED); gd.setCornerRadius(10); gd.setStroke(2, Color.WHITE); view.setBackground(gd); 

La documentación de GradientDrawable se puede encontrar aquí .

Editar: Para cada esquina por separado

Puede especificar el radio de cada esquina por separado usando el setCornerRadii (float[] radii) . "Para cada esquina, la matriz contiene 2 valores, [X_radius, Y_radius] .Las esquinas se ordenan arriba a la izquierda, arriba a la derecha, abajo a la derecha, abajo a la izquierda.Esta propiedad sólo se honra cuando la forma es del tipo RECTÁNGULO.

Se recomienda invocar mutate() antes de cambiar esta propiedad.

Puede implementar un dibujable personalizado. A continuación se muestra el ejemplo del xml.

 <?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:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp"/> </shape> 

Guarde este xml en la carpeta dibujable de su proyecto. Ahora úsalo como un dibujable normal para cualquier widget. Por ejemplo: android: background = "R.drawable.round_shape"

Este ejemplo se hace referencia en el siguiente enlace .

 GradientDrawable drawable = (GradientDrawable)image.getBackground(); drawable.setGradientRadius(radiuspx); 

Además de especificar la dimensión de la esquina redonda puede utilizar GradientDrawable y el método setCornerRadii ()

 GradientDrawable d = new GradientDrawable(); d.setCornerRadii({5.0f,5.0f,5.0f,5.0f}); textViewExample.setBackgroundResource(d); 
  • Deserialización GSON con tipos genéricos y nombres genéricos de campos
  • Respetando el bloqueo de rotación en android
  • org.json.JSONException: Objeto no terminado en el carácter 103 de
  • Cómo burlar un objeto inyectado que no se declara en el módulo?
  • Uso de la modularización en Android
  • Android: la gravedad falla en API 18+
  • Realización de una solicitud de publicación de varias partes con matriz de bytes comprimidos jpeg con resorte para android
  • Error: El método no estático 'findViewById (int)' no se puede referenciar desde un contexto estático
  • Serialización y subclases
  • 'IsGooglePlayServicesAvailable' (este) está obsoleto
  • Cómo insertar% 20 en lugar de espacio en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.