实现圆形头像功能的方法有很多,可以使用别人的开源,也可以自定义一个,而且挺简单的。
1.
Glide实现圆形图像
Glide.with(mContext)
.load(R.drawable.iv_image_header)
.error(R.drawable.ic_error_default)
.transform(new GlideCircleTransform(mContext))
.into(mImage);
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