圓形頭像DIY
現在大部分app使用的都是圓形頭像,網上開源的也很多,但是有沒有考慮過DIY圓形頭像呢?下面就自己實現一個,先看下demo展示
第一步:原理解釋(圖片很醜,原理很真)
1、畫外框圓形,需要使用自定義的顏色畫一個圓形,比圖片的半徑長5dp
2、自定義圓形畫好了後,將我們需要轉換成圓形頭像的圖片畫到上面,從中間開始覆蓋,得到如下圖片
3、中間擷取圖片,半徑設定為:r=min(width,height),圓心設為:cx=width/2,cy=height/2,這樣可以從中間開始擷取圓形圖片
第二步、程式碼實現
1、首先繼承ImageView
2、重寫onDraw(Canvas canvas)方法
3、設定圖片縮放型別setScaleType(ScaleType.CENTER_CROP); 中間擷取
具體程式碼如下:
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
setScaleType(ScaleType.CENTER_CROP);
Drawable drawable = getDrawable();
if (null == drawable) {
return;
}
// 將drawable轉換成bitmap==>網上找的
Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas srcCanvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawable.draw(srcCanvas);
float cx = getWidth() / 2;
float cy = getHeight() / 2;
float radius = Math.min(getWidth(), getHeight()) / 2;
Paint borderPaint = new Paint();
borderPaint.setAntiAlias(true);
borderPaint.setColor(Color.GREEN);
canvas.drawCircle(cx, cy, radius, borderPaint);
// 畫圖
BitmapShader shader = new BitmapShader(bitmap, TileMode.CLAMP,
TileMode.CLAMP);
Paint paint = new Paint();
paint.setShader(shader);
paint.setAntiAlias(true);
canvas.drawCircle(cx, cy, radius - 5, paint);
}
程式碼只是簡單的demo,當然可以定製成通用的CircleImageView,需要根據自己的需求DIY!!