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
và
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.
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. –
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. –