2013-03-19 28 views
8

Tôi đã xem xét cách tạo một ImageView tròn trong Android. Sau khi đọc câu hỏi đã được hỏi về đề tài này trên StackOverflow tại địa chỉ:Thông tư ImageView

How to make an image fit into a circular frame in android

How to set bitmap in circular imageview?

tôi đã đặt cùng ImageView riêng tôi bằng cách sử dụng các liên kết như một hướng dẫn mà những gì tôi cần nó cần làm: hình ảnh được làm tròn với đường viền.

Dưới đây là đoạn code mà tôi đang sử dụng:

public class CircularImageView extends ImageView 
{ 

private int borderWidth = 5; 
private int viewWidth; 
private int viewHeight; 
private Bitmap image; 
private Paint paint; 
private Paint paintBorder; 
private BitmapShader shader; 

public CircularImageView(Context context) { 
    super(context); 
    setup(); 
} 

public CircularImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setup(); 
} 

public CircularImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    setup(); 
} 

private void setup() 
{ 
    // init paint 
    paint = new Paint(); 
    paint.setAntiAlias(true); 

    paintBorder = new Paint(); 
    setBorderColor(Color.BLUE); 
    paintBorder.setAntiAlias(true);  
} 

public void setBorderWidth(int borderWidth) 
{ 
    this.borderWidth = borderWidth; 
    this.invalidate(); 
} 

public void setBorderColor(int borderColor) 
{  
    if(paintBorder != null) 
     paintBorder.setColor(borderColor); 

    this.invalidate(); 
} 

private void loadBitmap() 
{ 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); 

    if(bitmapDrawable != null) 
     image = bitmapDrawable.getBitmap(); 
} 

@SuppressLint("DrawAllocation") 
@Override 
public void onDraw(Canvas canvas) 
{ 
    //load the bitmap 
    loadBitmap(); 

    // init shader 
    if(image !=null) 
    { 
     // Create a shader with a scaled bitmap to match the view dimensions    
     shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     paint.setShader(shader); 
     int circleCenter = viewWidth/2; 

        // Draw the outer border 
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth, paintBorder); 
     // circleCenter is the x or y of the view's center 
     // radius is the radius in pixels of the cirle to be drawn 
     // paint contains the shader that will texture the shape    
     canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paint); 
    }  
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    int width = measureWidth(widthMeasureSpec); 
    int height = measureHeight(heightMeasureSpec, widthMeasureSpec);   

    viewWidth = width - (borderWidth *2); 
    viewHeight = height - (borderWidth*2); 

    setMeasuredDimension(width, height); 
} 

private int measureWidth(int measureSpec) 
{ 
     int result = 0; 
     int specMode = MeasureSpec.getMode(measureSpec); 
     int specSize = MeasureSpec.getSize(measureSpec); 

     if (specMode == MeasureSpec.EXACTLY) { 
      // We were told how big to be 
      result = specSize; 
     } else { 
      // Measure the text 
      result = viewWidth; 

     } 

    return result; 
} 

private int measureHeight(int measureSpecHeight, int measureSpecWidth) { 
    int result = 0; 
    int specMode = MeasureSpec.getMode(measureSpecHeight); 
    int specSize = MeasureSpec.getSize(measureSpecHeight); 

    if (specMode == MeasureSpec.EXACTLY) { 
     // We were told how big to be 
     result = specSize; 
    } else { 
     // Measure the text (beware: ascent is a negative number) 
     result = viewHeight;   
    } 
    return result; 
} 
} 

Tôi đang lên kế hoạch làm cho mã nguồn mở này và do đó sẽ đánh giá cao nếu ai đó có thể có một cái nhìn qua mã để đảm bảo tôi đang làm tất cả mọi thứ một cách chính xác.

+1

Trước hết, cảm ơn bạn đã chia sẻ mã của mình! Tôi không hoàn toàn chắc chắn định dạng stackoverflow phù hợp cho/có nghĩa là để xem xét mã, trừ khi bạn có câu hỏi * cụ thể * và hoặc các vấn đề với mã trong tầm tay. http://codereview.stackexchange.com/ có vẻ là một nơi thích hợp hơn hoặc một máy chủ Nguồn mở như GitHub có hiệu quả cho phép đánh giá mã thông qua các yêu cầu kéo. –

+0

Khi @ Paul-Jan cho biết sử dụng codereview.stackexchange.com và thứ hai, tốt hơn là tạo một tùy chỉnh có thể vẽ được cho loại điều này. Xem http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/ là cách hiệu quả nhất để làm những gì bạn làm. –

Trả lời

2

Hãy thử chức năng này để có được hình ảnh tròn góc:

private Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) 
    { 
     Bitmap 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; 
    } 
0

Nếu bạn không quá khắt khe về biên giới của các nút. thì tại sao bạn không tạo một tệp hình ảnh PNG tròn với các cạnh trong suốt.

0

Đây có thể không phải là cách tốt nhất và bạn có thể không thay đổi được nhiều thuộc tính, nhưng đó chắc chắn là cách dễ nhất. Tôi vừa sử dụng thư viện this và tôi đã tạo một lần xem hình tròn có cả đường viền.


Vì vậy, đây là giải pháp của tôi:

Đầu tiên, tôi đặt này trong tôi build.grandle:

`compile 'com.github.siyamed:android-shape-imageview:[email protected]'` 

Second, tôi đặt này trong tập tin .xml bố trí của tôi:

<com.github.siyamed.shapeimageview.CircularImageView 
        android:layout_width="150dp" 
        android:layout_gravity="center_horizontal" 
        android:layout_height="150dp" 
        android:id="@+id/photo" 
        app:siBorderWidth="5dp" 
        app:siBorderColor="#ffffff" 
        android:layout_alignParentTop="true" 
        android:layout_centerHorizontal="true" /> 

Trong file .java tôi, đây là cách tôi có thể mất hoặc thiết lập hình ảnh đến CircularImageView:

final com.github.siyamed.shapeimageview.CircularImageView photo = (com.github.siyamed.shapeimageview.CircularImageView) convertView.findViewById(R.id.photo); 

photo.setBackgroundResource(R.drawable.female); 

Đó là tất cả tôi đã thực hiện để làm tròn một hình ảnh với đường viền màu trắng.