studio redondo programacion boton android imageview rounded-corners antialiasing

redondo - Esquinas redondeadas antialias en Android ImageView



boton redondo android studio (2)

Esta pregunta ya tiene una respuesta aquí:

Soy nuevo en el desarrollo de Android, y he estado tratando durante unas horas ahora de agregar esquinas redondeadas agradables y suaves a un ImageView, sin éxito.

Lo primero que intenté fue simplemente redondear las esquinas de mis imágenes directamente, pero esto implica cambiar el mapa de bits, y como necesito mantener las crudas, y esas son bastante grandes, esto no es realmente amigable con la memoria. Esto también causaría otras dificultades ya que mi ImageView es fluido.

Lo segundo que traté de usar es el método clipPath después de subclasificar mi vista. Esto funciona, pero las esquinas tienen alias. Luego intenté agregar PaintFlagsDrawFilter para implementar el aliasing, pero esto no funcionó. Estoy usando monodroid, y me preguntaba si se suponía que funcionaba en Java.

Aquí está mi código (C #):

public class MyImageView : ImageView { private float[] roundedCorner; /** * Contains the rounded corners for the view. * You can define one, four or height values. * This behaves as the css border-radius property * * @see http://developer.android.com/reference/android/graphics/Path.html#addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction) */ public float[] RoundedCorners{ get{ return roundedCorner; } set{ float[] finalValue = new float[8]; int i=0; if(value.Length == 1){ for(i=0; i<8;i++){ finalValue[i] = value[0]; } }else if(value.Length == 4){ for(i=0; i<4;i++){ finalValue[2*i] = value[i]; finalValue[2*i+1] = value[i]; } } roundedCorner = finalValue; } } public SquareImageView (Context context) : base (context) { Initialize (); } public SquareImageView (Context context, IAttributeSet attrs) : base (context, attrs) { Initialize (); } private void Initialize () { RoundedCorners = new float[]{0,0,0,0}; } public override void Draw (Android.Graphics.Canvas canvas) { Path path = new Path(); path.AddRoundRect(new RectF(0,0, Width,Height),RoundedCorners, Path.Direction.Cw); canvas.ClipPath(path); base.Draw (canvas); } /** * try to add antialiasing. */ protected override void DispatchDraw (Canvas canvas) { canvas.DrawFilter = new PaintFlagsDrawFilter((PaintFlags)1, PaintFlags.AntiAlias); base.DispatchDraw (canvas); } }

¡Gracias por tu ayuda!


use el código debajo

public Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) { Bitmap output = null; if(bitmap != null) { output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = pixels; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); } return output; }

y llama a este método como

imageView.setImageBitmap(getRoundedCornerBitmap(bitmap, 10));


Creé un RoundedImageView basado en el código de ejemplo de Romain Guy que envuelve esta lógica en un ImageView que debería poder usar. Admite bordes y antialiasing fuera de la caja.

Es más eficiente que otros ejemplos de esquina redondeada porque no crea otra copia del mapa de bits, ni usa clipPath que dibuja dos veces en el lienzo.