1.圆形图片
public class CricleImageView extends ImageView {
private String TAG = "CricleImageView";
private Paint mPaint;
private int measuredWidth;
private int measuredHeight;
public CricleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measuredWidth = getMeasuredWidth();
measuredHeight = getMeasuredHeight();
int width = Math.min(measuredWidth, measuredHeight);
setMeasuredDimension(width, width);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if(drawable != null){
Bitmap bitmap = Bitmap.createBitmap(getWidth(),getHeight(),Config.ARGB_8888);
Canvas drawCanvas = new Canvas(bitmap);
float scale = getWidth() * 1.0f/ Math.min(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
Log.d(TAG, "measuredWidth : " + drawable.getIntrinsicWidth());
Log.d(TAG, "measuredHeight : " + drawable.getIntrinsicHeight());
Log.d(TAG, "scale : " + scale);
Log.d(TAG, "getWidth() : " + getWidth());
Log.d(TAG, "getHeight() : " + getHeight());
drawable.setBounds(0, 0, (int)(drawable.getIntrinsicWidth() * scale), (int)(drawable.getIntrinsicHeight() * scale));
drawable.draw(drawCanvas);
//获取图片的形状
Bitmap bmp = getBitMap();
mPaint.reset();
mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
drawCanvas.drawBitmap(bmp, 0, 0, mPaint);
canvas.drawBitmap(bitmap, 0, 0, null);
}
}
Bitmap getBitMap(){
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getWidth() / 2, getHeight() / 2), paint);
return bitmap;
}
}
2.圆角图片
public class RoundImageView extends ImageView {
private Paint mPaint;
private PorterDuffXfermode xfermode;
private WeakReference<Bitmap> mBitmap;
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
xfermode = new PorterDuffXfermode(Mode.DST_IN);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if(drawable != null){
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas drawCanvas = new Canvas(bitmap);
int dWidth = drawable.getIntrinsicWidth();
int dHeigh = drawable.getIntrinsicHeight();
float scale = Math.max(getWidth() * 1.0f / dWidth , getHeight() * 1.0f / dHeigh);
drawable.setBounds(0, 0, (int)(dWidth * scale), (int)(dHeigh * scale));
drawable.draw(drawCanvas);
Bitmap bmp = null;
if(mBitmap == null){
bmp = getBitmap();
mBitmap = new WeakReference<Bitmap>(bmp);
}else{
bmp = mBitmap.get();
}
mPaint.reset();
mPaint.setXfermode(xfermode);
drawCanvas.drawBitmap(bmp, 0, 0, mPaint);
canvas.drawBitmap(bitmap, 0, 0, null);
}
}
Bitmap getBitmap(){
Bitmap bmp = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
mPaint.reset();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), 10, 10, mPaint);
return bmp;
}
}