Ich habe untersucht, wie man eine runde ImageView in Android erstellen. Nach der Lektüre bereits Fragen zum Thema auf Stackoverflow bei gestellt:Circular ImageView
How to make an image fit into a circular frame in android
und
How to set bitmap in circular imageview?
habe ich mein eigenes Image über die Links als Leitfaden zusammengestellt, das tut, was ich brauche es zu tun: ein gerundetes Bild mit einer Grenze.
Unten ist der Code, den ich verwende:
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;
}
}
ich machen diese Open-Source bin der Planung und würde es daher begrüßen, wenn jemand einen Blick auf den Code, den ich alles tue, richtig, um sicherzustellen, haben könnte.
Zunächst einmal, vielen Dank für die Freigabe Ihres Codes! Ich bin mir nicht ganz sicher, ob das Stackoverflow-Format für Code-Reviews geeignet/geeignet ist, es sei denn, Sie haben * spezifische * Fragen und/oder Probleme mit dem Code zur Hand. http://codereview.stackexchange.com/ scheint ein geeigneterer Ort, oder ein Open-Source-Host wie GitHub, dass effektiv Code-Reviews durch Pull-Anfragen ermöglicht. –
Als @ Paul-Jan sagte codereview.stackexchange.com verwenden, und zweitens, es ist besser, ein benutzerdefiniertes Zeichen für diese Art von Sache zu erstellen. Sehen Sie http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/ welches die speicherfreundlichste Art ist, das zu tun, was Sie tun. –