Android学习笔记--自定义圆形头像简单实现

实现圆形头像功能的方法有很多,可以使用别人的开源,也可以自定义一个,而且挺简单的。

1.

Glide实现圆形图像


        Glide.with(mContext)
        .load(R.drawable.iv_image_header)
        .error(R.drawable.ic_error_default)
        .transform(new GlideCircleTransform(mContext))
        .into(mImage);
  
2.自定义view

public class CircleImage extends AppCompatImageView {

    Paint p1;
    int width, height;


    public CircleImage(Context context) {
        super(context);

    }

    public CircleImage(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

//        int src_resource = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "src", 0);
//        bitmap= BitmapFactory.decodeStream(getResources().openRawResource(src_resource));
    }

    public CircleImage(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = MeasureSpec.getSize(widthMeasureSpec);
        height = MeasureSpec.getSize(heightMeasureSpec);
        int size = Math.min(width, height);
        setMeasuredDimension(size, size);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int radis = Math.min(width, height) / 2;

        if (getDrawable() == null){ //如果没有在xml设置图片资源时
            Paint paint=new Paint();
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            canvas.drawCircle(radis, radis, radis, paint);
        }
        else {
            Bitmap bp = getBitmapFromDrawble(getDrawable());
            p1 = new Paint();
            Matrix matrix = new Matrix();

            float scale = radis * 2.0f / Math.min(bp.getWidth(), bp.getHeight());
            matrix.setScale(scale, scale);
//BitmapShader的作用就是通过Paint对画布进行置顶Bitmap的填充,填充时有以下几种模式可以选择:
//            1.CLAMP 拉伸 拉伸的是图片最后的哪一个像素,不断重复
//            2.REPEAT 重复 横向、纵向不断重复
//            3.MIRROR 镜像 横向不断翻转重复,纵向不断翻转重复
            BitmapShader bitmapShader = new BitmapShader(bp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            bitmapShader.setLocalMatrix(matrix);
            p1.setShader(bitmapShader);
            canvas.drawCircle(radis, radis, radis, p1);
        }

    }

    /***
     * 获取bitmap
     * @param drawable
     * @return
     */
    public Bitmap getBitmapFromDrawble(Drawable drawable) {
        Bitmap bitmap = null;
        if (drawable instanceof BitmapDrawable) {
            BitmapDrawable bd = (BitmapDrawable) drawable;
            return bd.getBitmap();
        }
        int w = drawable.getIntrinsicWidth();
        int h = drawable.getIntrinsicHeight();
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        return bitmap;
    }

}

其中BitmapShader,  Shader家族的 专门处理图片渲染的.可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形,那么Shader是什么呢?做过GPU绘图的同学应该都知道这个词汇,Shader就是着色器的意思。我们可以这样理解,Canvas中的各种drawXXX方法定义了图形的形状,画笔中的Shader则定义了图形的着色、外观,二者结合到一起就决定了最终Canvas绘制的被色彩填充的图形的样子。具体请前往

http://blog.csdn.net/iispring/article/details/50500106


详细代码给出,有需要的自行参考,不足之处,请指出。

还有其他大牛实现的博客,个人感到十分不错,推荐给各位:

http://blog.csdn.net/zhoubin1992/article/details/47258639



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值