2012-06-20 34 views
9

Tôi mới dùng android dev và tôi đã cố gắng thêm vài giờ để thêm các góc tròn đẹp và mượt mà vào ImageView mà không thành công. Điều đầu tiên tôi đã thử chỉ đơn giản là làm tròn các góc của hình ảnh trực tiếp, nhưng điều này có nghĩa là thay đổi bitmap, và vì tôi cần giữ lại hình ảnh thô, và chúng khá lớn, điều này không thực sự thân thiện với bộ nhớ. Điều này cũng sẽ gây ra những khó khăn khác vì ImageView của tôi là chất lỏng.Góc được làm tròn thiên văn trên Android ImageView

Điều thứ hai tôi đã cố gắng sử dụng là phương pháp clipPath sau khi phân lớp chế độ xem của tôi. Điều này hoạt động, nhưng các góc được đặt bí danh. Sau đó tôi đã thử thêm một PaintFlagsDrawFilter để thực hiện các răng cưa, nhưng điều này đã không làm việc. Tôi đang sử dụng monodroid, và tôi đã tự hỏi điều này được cho là làm việc trong Java.

Đây là mã của tôi (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); 
    } 

} 

Nhờ sự giúp đỡ của bạn!

Trả lời

1

sử dụng mã dưới đây

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

và gọi phương pháp này như

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

Cảm ơn câu trả lời của bạn. Nhưng như tôi đã nói, tôi đã cố gắng làm tròn các góc của hình ảnh của mình, nhưng vì tôi cần một bitmap có kích thước chất lỏng, điều này ngụ ý giữ một tham chiếu đến ảnh gốc, và tôi muốn tránh điều này. Về cơ bản tôi muốn làm tròn các góc của chính nó, như thể tôi đang sử dụng giải pháp này: [link] (http://stackoverflow.com/questions/1683185/android-listview-with-rounded-corners) –

+1

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

2

Tôi đã tạo một RoundedImageView dựa tắt Romain Guy example code rằng kết thúc tốt đẹp logic này vào một ImageView rằng bạn sẽ có thể chỉ dùng. Nó hỗ trợ biên giới và antialiasing ra khỏi hộp.

Hiệu quả hơn các ví dụ góc tròn khác vì nó không tạo bản sao bitmap khác, cũng không sử dụng clipPath vẽ hai lần vào canvas.

+0

Điều này có vẻ đẹp, và có vẻ là những gì tôi đang tìm kiếm. Tôi không có bất kỳ android để kiểm tra nó ngay bây giờ, vì vậy tôi không chắc chắn nếu tôi nên đánh dấu câu hỏi này như là một câu trả lời –