2012-06-20 5 views
9

Ich bin neu bei Android Dev, und ich habe seit ein paar Stunden versucht, fügen Sie schöne und glatte abgerundete Ecken zu einem ImageView, ohne Erfolg.Antialiased abgerundeten Ecken auf Android ImageView

Das erste, was ich ausprobiert habe, ist einfach die Ecken meiner Bilder direkt zu runden, aber das bedeutet, die Bitmap zu ändern, und da ich die rohen behalten muss, und das sind ziemlich große, das ist nicht wirklich speicherfreundlich. Dies würde auch andere Schwierigkeiten verursachen, da mein ImageView flüssig ist.

Zweite Sache, die ich versuchte zu verwenden, ist die ClipPath-Methode nach Unterklassen meiner Ansicht. Das funktioniert, aber Ecken sind Alias. Ich habe dann versucht, einen PaintFlagsDrawFilter hinzuzufügen, um das Aliasing zu implementieren, aber das hat nicht funktioniert. Ich benutze monodroid, und ich fragte mich, ob das in Java funktionieren sollte.

Hier ist mein Code (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); 
    } 

} 

Vielen Dank für Ihre Hilfe!

Antwort

1

Verwendung unter Code

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; 
    } 

und rufen diese Methode wie

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

Danke für Ihre Antwort. Aber wie gesagt, ich habe bereits versucht, die Ecken meines Bildes abzurunden, aber da ich eine Bitmap in flüssiger Größe benötige, bedeutet dies, dass ich einen Verweis auf das Original halte, und das möchte ich vermeiden. Grundsätzlich möchte ich die Ecken der Ansicht selbst runden, als ob ich diese Lösung verwenden würde: [link] (http://stackoverflow.com/questions/1683185/android-listview-with-rounded-corner) –

+1

Okay @Alex Siehe hierzu [link] (http://stackoverflow.com/questions/6539781/android-imageview-with-rounded-corners-not-working) –

2

ich angelegt habe ein RoundedImageView basiert weg Romain Guy example code, die diese Logik in eine Image wickelt, die Sie in der Lage sein sollte benutz einfach. Es unterstützt Grenzen und Antialiasing out of the box.

Es ist effizienter als andere Beispiele mit abgerundeten Ecken, da es keine weitere Kopie der Bitmap erstellt und auch nicht clipPath verwendet, das zweimal auf die Arbeitsfläche zeichnet.

+0

Das sieht gut aus und scheint das zu sein, wonach ich gesucht habe. Ich habe keinen Android, um es jetzt zu testen, also bin ich mir nicht sicher, ob ich diese Frage als beantwortet markieren sollte –