展示圆形图片。把原始图片剪切成圆形图片进行展示。
就是把图片转变成原型图片画在展示器中(ImageAware)。
源码:
/**
* Can display bitmap cropped by a circle. This implementation works only with ImageViews wrapped
* in ImageViewAware.
* <br />
* If this implementation doesn't meet your needs then consider
* <a href="https://github.com/vinc3m1/RoundedImageView">RoundedImageView</a> or
* <a href="https://github.com/Pkmmte/CircularImageView">CircularImageView</a> projects for usage.
*
* @author Qualtagh, Sergey Tarasevich (nostra13[at]gmail[dot]com)
* @since 1.9.5
*/
public class CircleBitmapDisplayer implements BitmapDisplayer {
protected final Integer strokeColor;//边线颜色
protected final float strokeWidth;//边线宽度
public CircleBitmapDisplayer() {
this(null);
}
public CircleBitmapDisplayer(Integer strokeColor) {
this(strokeColor, 0);
}
public CircleBitmapDisplayer(Integer strokeColor, float strokeWidth) {
this.strokeColor = strokeColor;
this.strokeWidth = strokeWidth;
}
@Override
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
if (!(imageAware instanceof ImageViewAware)) {
throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
}
imageAware.setImageDrawable(new CircleDrawable(bitmap, strokeColor, strokeWidth));
}
public static class CircleDrawable extends Drawable {//圆形图片
protected float radius;//整个图片半径
protected final RectF mRect = new RectF();
protected final RectF mBitmapRect;
protected final BitmapShader bitmapShader;
protected final Paint paint;//画图片
protected final Paint strokePaint;//画边线
protected final float strokeWidth;
protected float strokeRadius;//不包括边框在内的图片半径
public CircleDrawable(Bitmap bitmap, Integer strokeColor, float strokeWidth) {
radius = Math.min(bitmap.getWidth(), bitmap.getHeight()) / 2;
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader);
paint.setFilterBitmap(true);
paint.setDither(true);
if (strokeColor == null) {
strokePaint = null;
} else {
strokePaint = new Paint();
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setColor(strokeColor);
strokePaint.setStrokeWidth(strokeWidth);
strokePaint.setAntiAlias(true);
}
this.strokeWidth = strokeWidth;
strokeRadius = radius - strokeWidth / 2;
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mRect.set(0, 0, bounds.width(), bounds.height());
radius = Math.min(bounds.width(), bounds.height()) / 2;
strokeRadius = radius - strokeWidth / 2;
// Resize the original bitmap to fit the new bound
Matrix shaderMatrix = new Matrix();
shaderMatrix.setRectToRect(mBitmapRect, mRect, Matrix.ScaleToFit.FILL);
bitmapShader.setLocalMatrix(shaderMatrix);
}
@Override
public void draw(Canvas canvas) {
canvas.drawCircle(radius, radius, radius, paint);//画图
if (strokePaint != null) {//画边线
canvas.drawCircle(radius, radius, strokeRadius, strokePaint);
}
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
paint.setColorFilter(cf);
}
}
}