2012-06-20 13 views
9

Ben android dev için yeni ve şimdi bir ImageView'a, başarılı olmadan güzel ve pürüzsüz yuvarlak köşeler eklemek için birkaç saat çalışıyorum.Antialiased yuvarlatılmış köşeleri Android'de ImageView

Denediğim ilk şey, doğrudan resimlerimin köşelerini yuvarlaklaştırmaktır, ancak bu bitmapi değiştirmeyi gerektirir ve ham olanları tutmaya ihtiyacım olduğu için ve bunlar oldukça büyüktür, bu gerçekten bellek dostu değildir. Bu, ImageView'ım sıvı olduğundan, diğer zorluklara da neden olur.

Kullanmaya çalıştığım ikinci şey, görünümümü alt sınıflara ayırdıktan sonra clipPath yöntemidir. Bu çalışır, ancak köşeler takma addır. Daha sonra takma ad uygulamak için bir PaintFlagsDrawFilter eklemeye çalıştı, ancak bu işe yaramadı. Monodroid kullanıyorum ve bunun Java’da çalışması gerektiğini düşünüyordum. Yardımlarınız için

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

} 

Teşekkür:

İşte benim kodu (C#) 'dir! kodunun altına

cevap

1

kullanım

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

ve çağrı oluşturduğum

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

Cevabınız için teşekkür ederiz. Ama dediğim gibi, şimdiye kadar görüntümün köşelerini yuvarlaklaştırmaya çalıştım, ama sıvı büyüklüğünde bir bitmap'e ihtiyaç duyduğumdan, bu orjinal bir referansa işaret etmek anlamına geliyor ve bundan kaçınmak istiyorum. Temel olarak, bu çözümü kullanıyormuşum gibi, görünümün köşelerini yuvarlaklaştırmak istiyorum: [link] (http://stackoverflow.com/questions/1683185/android-listview-with-rounded-corners) –

+1

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

2

gibi bu yöntem bir RoundedImageView kapalı tabanlı sen gerekir Bir ImageView içine bu mantığı sarar Romain Guy example code sadece kullan. Kutudan sınırları ve antialiasing destekler.

Diğer yuvarlak köşeli örneklerden daha verimlidir, çünkü bu bitmapi başka bir kopyasını oluşturmaz ve tuvale iki kez çekilen clipPath işlevini kullanmaz.

+0

Bu güzel görünüyor ve aradığım şey gibi görünüyor. Şu anda test edebilecek bir androidim yok, bu yüzden bu soruyu cevap olarak işaretlemem gerektiğinden emin değilim –

İlgili konular