圆形头像白边加阴影

作者: 只喝纯牛奶的哈趴狗 | 来源:发表于2016-09-14 14:08 被阅读0次

    先上效果图:

    上一段源码

    ```

    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转成圆形

    */

    publicBitmaptoRoundBitmap(Bitmap bitmap) {

    intwidth = bitmap.getWidth();

    intheight = bitmap.getHeight();

    intr =0;

    //取最短边做边长

    if(width < height) {

    r = width;

    }else{

    r = height;

    }

    //构建一个bitmap

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

    //new一个Canvas,在backgroundBmp上画图

    Canvas canvas =newCanvas(backgroundBm);

    Paint p =newPaint();

    //设置边缘光滑,去掉锯齿

    p.setAntiAlias(true);

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

    //通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,

    //且都等于r/2时,画出来的圆角矩形就是圆

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

    //设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉

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

    //canvas将bitmap画在backgroundBmp上

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

    returnbackgroundBm;

    }

    ```

    首次写文章下次修改。

    相关文章

      网友评论

        本文标题:圆形头像白边加阴影

        本文链接:https://www.haomeiwen.com/subject/enhwjttx.html