2012-06-20 25 views
9

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

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 conservar 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 la subclasificación de mi vista. Esto funciona, pero las esquinas tienen alias. Luego intenté agregar un 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 su ayuda!

Respuesta

1

utilizar por debajo de código

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 llamar a este método como

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

Gracias por su respuesta. Pero como ya he dicho, ya he intentado redondear las esquinas de mi imagen, pero dado que necesito un mapa de bits de tamaño fluido, esto implica mantener una referencia al original, y me gustaría evitar esto. Básicamente quiero redondear las esquinas de la vista en sí, como si estuviera usando esta solución: [link] (http://stackoverflow.com/questions/1683185/android-listview-with-rounded-corners) –

+1

Bien @Alex ver este [enlace] (http://stackoverflow.com/questions/6539781/android-imageview-with-rounded-corners-not-working) –

2

He creado un RoundedImageView con sede fuera de example code Romain individuo que envuelve esta lógica en un ImageView que usted debería ser capaz de Solo usa. Admite bordes y antialiasing fuera de la caja.

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

+0

Esto se ve bien, y parece ser lo que estaba buscando. No tengo ningún Android para probarlo en este momento, así que no estoy seguro de si debería marcar esta pregunta como una respuesta –