圓形頭像白邊加陰影

先上效果圖:

上一段源碼

```

public class CircularImageView extends ImageView

{

private int borderWidth = 4;

private int viewWidth;

private int viewHeight;

private Bitmap image;

private Paint paint;

private Paint paintBorder;

private BitmapShader shader;

public CircularImageView(Context context)

{

super(context);

setup();

}

public CircularImageView(Context context, AttributeSet attrs)

{

super(context, attrs);

setup();

}

public CircularImageView(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

setup();

}

private void setup()

{

// init paint

paint = new Paint();

paint.setAntiAlias(true);

paintBorder = new Paint();

setBorderColor(Color.WHITE);

paintBorder.setAntiAlias(true);

this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);

paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);

}

public void setBorderWidth(int borderWidth)

{

this.borderWidth = borderWidth;

this.invalidate();

}

public void setBorderColor(int borderColor)

{

if (paintBorder != null)

paintBorder.setColor(borderColor);

this.invalidate();

}

private void loadBitmap()

{

BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();

if (bitmapDrawable != null)

image = bitmapDrawable.getBitmap();

}

@SuppressLint("DrawAllocation")

@Override

public void onDraw(Canvas canvas)

{

// load the bitmap

loadBitmap();

// init shader

if (image != null)

{

shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

paint.setShader(shader);

int circleCenter = viewWidth / 2;

// circleCenter is the x or y of the view's center

// radius is the radius in pixels of the cirle to be drawn

// paint contains the shader that will texture the shape

canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder);

canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 4.0f, paint);

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

{

int width = measureWidth(widthMeasureSpec);

int height = measureHeight(heightMeasureSpec, widthMeasureSpec);

viewWidth = width - (borderWidth * 2);

viewHeight = height - (borderWidth * 2);

setMeasuredDimension(width, height);

}

private int measureWidth(int measureSpec)

{

int result = 0;

int specMode = MeasureSpec.getMode(measureSpec);

int specSize = MeasureSpec.getSize(measureSpec);

if (specMode == MeasureSpec.EXACTLY)

{

// We were told how big to be

result = specSize;

}

else

{

// Measure the text

result = viewWidth;

}

return result;

}

private int measureHeight(int measureSpecHeight, int measureSpecWidth)

{

int result = 0;

int specMode = MeasureSpec.getMode(measureSpecHeight);

int specSize = MeasureSpec.getSize(measureSpecHeight);

if (specMode == MeasureSpec.EXACTLY)

{

// We were told how big to be

result = specSize;

}

else

{

// Measure the text (beware: ascent is a negative number)

result = viewHeight;

}

return (result + 2);

}

}


/**

* 把bitmap轉(zhuǎn)成圓形

*/

publicBitmaptoRoundBitmap(Bitmap bitmap) {

intwidth = bitmap.getWidth();

intheight = bitmap.getHeight();

intr =0;

//取最短邊做邊長(zhǎng)

if(width < height) {

r = width;

}else{

r = height;

}

//構(gòu)建一個(gè)bitmap

Bitmap backgroundBm = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);

//new一個(gè)Canvas,在backgroundBmp上畫圖

Canvas canvas =newCanvas(backgroundBm);

Paint p =newPaint();

//設(shè)置邊緣光滑,去掉鋸齒

p.setAntiAlias(true);

RectF rect =newRectF(0,0,r,r);

//通過(guò)制定的rect畫一個(gè)圓角矩形,當(dāng)圓角X軸方向的半徑等于Y軸方向的半徑時(shí),

//且都等于r/2時(shí),畫出來(lái)的圓角矩形就是圓

canvas.drawRoundRect(rect,r /2,r /2,p);

//設(shè)置當(dāng)兩個(gè)圖形相交時(shí)的模式,SRC_IN為取SRC圖形相交的部分,多余的將被去掉

p.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));

//canvas將bitmap畫在backgroundBmp上

canvas.drawBitmap(bitmap, null,rect,p);

returnbackgroundBm;

}

```



首次寫文章下次修改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容