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

来源:互联网 发布:欧拉回路算法 编辑:程序博客网 时间:2024/06/02 04:12

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

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