懒得哔哔,这种东西很多,我只是乐于分享
哈哈哈
public class CircleImageViewextends android.support.v7.widget.AppCompatImageView {
/**
* 图片显示的模式,按比例缩放图片,使得图片长 (宽)的大于等于视图的相应维度
*/
private static final ScaleTypeSCALE_TYPE = ScaleType.CENTER_CROP;
/**
* ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,
* ALPHA_8 代表8位Alpha位图
* ARGB_4444 代表16位ARGB位图
* ARGB_8888 代表32位ARGB位图
* RGB_565 代表8位RGB位图
*/
private static final Bitmap.ConfigBITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION =2;
/**
* 圆形image的边框大小
*/
private static final int DEFAULT_BORDER_WIDTH =0;
/**
* 圆形image的边框颜色,默认为黑色
*/
private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
/**
* 填充颜色,默认为:透明
*/
private static final int DEFAULT_FILL_COLOR = Color.TRANSPARENT;
/**
*
*/
private static final boolean DEFAULT_BORDER_OVERLAY =false;
private final RectFmDrawableRect =new RectF();
private final RectFmBorderRect =new RectF();
private final MatrixmShaderMatrix =new Matrix();
private final PaintmBitmapPaint =new Paint();
private final PaintmBorderPaint =new Paint();
private final PaintmFillPaint =new Paint();
/**
* 边框颜色
*/
private int mBorderColor =DEFAULT_BORDER_COLOR;
/**
* 边框大小
*/
private int mBorderWidth =DEFAULT_BORDER_WIDTH;
/**
* 填充颜色
*/
private int mFillColor =DEFAULT_FILL_COLOR;
private BitmapmBitmap;
/**
* BitmapShader的作用就是通过Paint对画布进行置顶Bitmap的填充,填充时有以下几种模式可以选择:
* 1.CLAMP 拉伸 拉伸的是图片最后的哪一个像素,不断重复
* 2.REPEAT 重复 横向、纵向不断重复
* 3.MIRROR 镜像 横向不断翻转重复,纵向不断翻转重复
*/
private BitmapShadermBitmapShader;
private int mBitmapWidth;
private int mBitmapHeight;
private float mDrawableRadius;
private float mBorderRadius;
private ColorFiltermColorFilter;
private boolean mReady;
private boolean mSetupPending;
private boolean mBorderOverlay;
private boolean mDisableCircularTransformation;
public CircleImageView(Context context) {
super(context);
init();
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_circle_border_width, DEFAULT_BORDER_WIDTH);
mBorderColor = a.getColor(R.styleable.CircleImageView_circle_border_color, DEFAULT_BORDER_COLOR);
mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_circle_border_overlay, DEFAULT_BORDER_OVERLAY);
mFillColor = a.getColor(R.styleable.CircleImageView_circle_fill_color, DEFAULT_FILL_COLOR);
a.recycle();
init();
}
private void init() {
super.setScaleType(SCALE_TYPE);
mReady =true;
if (mSetupPending) {
setup();
mSetupPending =false;
}
}
@Override
public ScaleTypegetScaleType() {
return SCALE_TYPE;
}
@Override
public void setScaleType(ScaleType scaleType) {
if (scaleType !=SCALE_TYPE) {
throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
}
}
@Override
public void setAdjustViewBounds(boolean adjustViewBounds) {
if (adjustViewBounds) {
throw new IllegalArgumentException("adjustViewBounds not supported.");
}
}
@Override
protected void onDraw(Canvas canvas) {
if (mDisableCircularTransformation) {
super.onDraw(canvas);
return;
}
if (mBitmap ==null) {
return;
}
if (mFillColor != Color.TRANSPARENT) {
canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mFillPaint);
}
canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRadius, mBitmapPaint);
if (mBorderWidth >0) {
canvas.drawCircle(mBorderRect.centerX(), mBorderRect.centerY(), mBorderRadius, mBorderPaint);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setup();
}
@Override
public void setPadding(int left, int top, int right, int bottom) {
super.setPadding(left, top, right, bottom);
setup();
}
@Override
public void setPaddingRelative(int start, int top, int end, int bottom) {
super.setPaddingRelative(start, top, end, bottom);
setup();
}
public int getBorderColor() {
return mBorderColor;
}
public void setBorderColor(@ColorInt int borderColor) {
if (borderColor ==mBorderColor) {
return;
}
mBorderColor = borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}
/**
* Set a color to be drawn behind the circle-shaped drawable. Note that
* this has no effect if the drawable is opaque or no drawable is set.
*
* @param fillColor The color to be drawn behind the drawable
*
* @deprecated Fill color support is going to be removed in the future
*/
@Deprecated
public void setFillColor(@ColorInt int fillColor) {
if (fillColor ==mFillColor) {
return;
}
mFillColor = fillColor;
mFillPaint.setColor(fillColor);
invalidate();
}
/**
* Set a color to be drawn behind the circle-shaped drawable. Note that
* this has no effect if the drawable is opaque or no drawable is set.
*
* @param fillColorRes The color resource to be resolved to a color and
* drawn behind the drawable
*
* @deprecated Fill color support is going to be removed in the future
*/
@Deprecated
public void setFillColorResource(@ColorRes int fillColorRes) {
setFillColor(getContext().getResources().getColor(fillColorRes));
}
public int getBorderWidth() {
return mBorderWidth;
}
public void setBorderWidth(int borderWidth) {
if (borderWidth ==mBorderWidth) {
return;
}
mBorderWidth = borderWidth;
setup();
}
public boolean isBorderOverlay() {
return mBorderOverlay;
}
public void setBorderOverlay(boolean borderOverlay) {
if (borderOverlay ==mBorderOverlay) {
return;
}
mBorderOverlay = borderOverlay;
setup();
}
public boolean isDisableCircularTransformation() {
return mDisableCircularTransformation;
}
public void setDisableCircularTransformation(boolean disableCircularTransformation) {
if (mDisableCircularTransformation == disableCircularTransformation) {
return;
}
mDisableCircularTransformation = disableCircularTransformation;
initializeBitmap();
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
initializeBitmap();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
initializeBitmap();
}
@Override
public void setImageResource(@DrawableRes int resId) {
super.setImageResource(resId);
initializeBitmap();
}
@Override
public void setImageURI(Uri uri) {
super.setImageURI(uri);
initializeBitmap();
}
@Override
public void setColorFilter(ColorFilter cf) {
if (cf ==mColorFilter) {
return;
}
mColorFilter = cf;
applyColorFilter();
invalidate();
}
@Override
public ColorFiltergetColorFilter() {
return mColorFilter;
}
private void applyColorFilter() {
if (mBitmapPaint !=null) {
mBitmapPaint.setColorFilter(mColorFilter);
}
}
private BitmapgetBitmapFromDrawable(Drawable drawable) {
if (drawable ==null) {
return null;
}
if (drawableinstanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
try {
Bitmap bitmap;
if (drawableinstanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
}else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
}
Canvas canvas =new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
private void initializeBitmap() {
if (mDisableCircularTransformation) {
mBitmap =null;
}else {
mBitmap = getBitmapFromDrawable(getDrawable());
}
setup();
}
private void setup() {
if (!mReady) {
mSetupPending =true;
return;
}
if (getWidth() ==0 && getHeight() ==0) {
return;
}
if (mBitmap ==null) {
invalidate();
return;
}
mBitmapShader =new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);
mFillPaint.setStyle(Paint.Style.FILL);
mFillPaint.setAntiAlias(true);
mFillPaint.setColor(mFillColor);
mBitmapHeight =mBitmap.getHeight();
mBitmapWidth =mBitmap.getWidth();
mBorderRect.set(calculateBounds());
mBorderRadius = Math.min((mBorderRect.height() -mBorderWidth) /2.0f, (mBorderRect.width() -mBorderWidth) /2.0f);
mDrawableRect.set(mBorderRect);
if (!mBorderOverlay &&mBorderWidth >0) {
mDrawableRect.inset(mBorderWidth -1.0f, mBorderWidth -1.0f);
}
mDrawableRadius = Math.min(mDrawableRect.height() /2.0f, mDrawableRect.width() /2.0f);
applyColorFilter();
updateShaderMatrix();
invalidate();
}
private RectFcalculateBounds() {
int availableWidth = getWidth() - getPaddingLeft() - getPaddingRight();
int availableHeight = getHeight() - getPaddingTop() - getPaddingBottom();
int sideLength = Math.min(availableWidth, availableHeight);
float left = getPaddingLeft() + (availableWidth - sideLength) /2f;
float top = getPaddingTop() + (availableHeight - sideLength) /2f;
return new RectF(left, top, left + sideLength, top + sideLength);
}
private void updateShaderMatrix() {
float scale;
float dx =0;
float dy =0;
mShaderMatrix.set(null);
if (mBitmapWidth *mDrawableRect.height() >mDrawableRect.width() *mBitmapHeight) {
scale =mDrawableRect.height() / (float)mBitmapHeight;
dx = (mDrawableRect.width() -mBitmapWidth * scale) *0.5f;
}else {
scale =mDrawableRect.width() / (float)mBitmapWidth;
dy = (mDrawableRect.height() -mBitmapHeight * scale) *0.5f;
}
mShaderMatrix.setScale(scale, scale);
mShaderMatrix.postTranslate((int) (dx +0.5f) +mDrawableRect.left, (int) (dy +0.5f) +mDrawableRect.top);
mBitmapShader.setLocalMatrix(mShaderMatrix);
}
}
样式资源文件:
不知道为什么不能直接粘贴代码