圆形头像

159 阅读1分钟
package lemon.view.com.lemonphotoview.view;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;
import lemon.view.com.lemonphotoview.R;
import lemon.view.com.lemonphotoview.view.utils.DpPxUtil;


public class TouXiangView extends View {


    private PorterDuffXfermode xfermode;

    private Bitmap bitmap;

    private Paint paint;

    private int padding = DpPxUtil.dip2px(getContext(), 50);
    private int width = DpPxUtil.dip2px(getContext(), 300);
    private int circleWidth = DpPxUtil.dip2px(getContext(), 5);
    private RectF outerArea;

    public TouXiangView(Context context) {
        super(context);
    }

    public TouXiangView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private RectF drawArea;

    {
        paint = new Paint();
        paint.setAntiAlias(true);

        bitmap = getBitmap((int) (width * 1.5));
        xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);

        outerArea = new RectF(padding, padding, padding + width, padding + width);
        drawArea = new RectF(padding+ circleWidth, padding+ circleWidth, padding + width- circleWidth, padding + width- circleWidth);


    }

    /**
     * 得到指定宽度的图片,高度会等比缩放
     * 原图可能很大,不需要这么大的图片,为了节省内存 ,得到一张小的bitmap
     *
     * @param width
     * @return
     */
    private Bitmap getBitmap(int width) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.bitmap, options);
        options.inJustDecodeBounds = false;
        options.inDensity = options.outWidth;
        options.inTargetDensity = width;
        return BitmapFactory.decodeResource(getResources(), R.drawable.bitmap, options);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 画一个红色圆作为底色,会有红边效果
        paint.setColor(Color.RED);
        canvas.drawOval(outerArea, paint);

        //0. 离屏缓存,截取这个区域进行绘制,不然圆形的底部是整个View的区域,使用xfermode会有融合问题
        canvas.saveLayer(drawArea, paint, Canvas.ALL_SAVE_FLAG);

        //1. 先画一个圆形;
        canvas.drawOval(drawArea, paint);// 小圆圈,
        //2. 把笔设置为SRC_IN模式,意味这把底部的圆形当做绘制形状,把接下来绘制的bitmap当做绘制内容,进行合成图片
        paint.setXfermode(xfermode);
        //3.再画一个bitmap
        canvas.drawBitmap(bitmap, padding, padding, paint);

        //4. 还原paint和canvas
        paint.setXfermode(null);
        canvas.restore();

    }
}