曾经自己写了个简单的ImageView,展示圆形的头像,将图片画成成圆形,带边框阴影,一目了然,今天贴出来记录一下
直接copy进项目直接使用,方便修改!
package com.cleanmaster.bitmapcache;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.ViewGroup;
import com.cleanmaster.base.util.system.DimenUtils;
public class PersonalCenterHeadView extends ImageView{
private int mHeight = 0;
private int mWidth = 0;
private int mColor = Color.TRANSPARENT;
private int mStrokeWidth = 0;
private boolean mIsDrawerWithConer = true;
private boolean mHasShadow = false;
private int mShadowColor= Color.GRAY;
private Bitmap bm = null;
private PaintFlagsDrawFilter drawFilter = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);
protected Rect iconRect = new Rect(0, 0, 0, 0);
public PersonalCenterHeadView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setDrawerWithConer(boolean withConer){
mIsDrawerWithConer = withConer;
}
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
int radius = bitmap.getWidth() / 2;
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
//画阴影
if(mHasShadow){
Paint paintBottom = new Paint();
paintBottom.setAntiAlias(true);
paintBottom.setColor(mShadowColor);
canvas.drawCircle(radius, radius+1, radius-mStrokeWidth+3, paintBottom);
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(bitmapShader);
canvas.drawCircle(radius, radius, radius-mStrokeWidth, paint);
//画边框
Paint paintBorder = new Paint();
paintBorder.setStyle(Paint.Style.STROKE);//这个style设置为stroke之后就是会画出一个环形
paintBorder.setStrokeWidth(mStrokeWidth);//这个设置环形的宽度
paintBorder.setAntiAlias(true);
paintBorder.setColor(mColor);
canvas.drawCircle(radius, radius, radius-mStrokeWidth, paintBorder);
return output;
}
public void setStrokeWidth(int strokeWidth) {
this.mStrokeWidth = strokeWidth;
}
public void setShadow(boolean hasShadow){
mHasShadow = hasShadow;
}
public void setShadowColor(int color){
mShadowColor = color;
}
//设置颜色
public void setColour(int color){
this.mColor = color;
}
public synchronized void setimage(Bitmap bitmap) {
int max = DimenUtils.dp2px(getContext(), 64);
if(bitmap.getHeight() > 0){
ViewGroup.LayoutParams params = getLayoutParams();
mWidth = bitmap.getWidth();
if(mWidth >= max){
mWidth = max;
}
mHeight = bitmap.getHeight();
if(mHeight >= max){
mHeight = max;
}
if(null == params){
params = new ViewGroup.LayoutParams(mWidth, mHeight);
}
params.width = mWidth;
params.height = mHeight;
setLayoutParams(params);
invalidate();
}
}
private void initPaint() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
paint.setColor(Color.WHITE);
paint.setTextAlign(Paint.Align.CENTER);
}
public void setImageBitmap(Bitmap object) {
bm = object;
invalidate();
}
private int measureSize(int measureSpec) {
return MeasureSpec.getSize(measureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (paint == null) { initPaint(); }
if (iconRect == null || paint == null) { return; }
canvas.setDrawFilter(drawFilter); // 去除锯齿
if (null != bm && !bm.isRecycled()) {
Bitmap bitmap = getRoundedCornerBitmap(bm);
if (bitmap != null) {
canvas.drawBitmap(bitmap, null, iconRect, paint);
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = measureSize(widthMeasureSpec);
int height = measureSize(heightMeasureSpec);
iconRect.set(0, 0, width, height);
}
}
其实当该控件被调用的时候,会调用onDraw方法将图片画上去,在此之前需要对bitmap进行处理,上面黑体字便是关键的代码,其实只要拿到bitmap就能够处理成各种形状