最近项目有个需求,是把图片缩放成圆形,头像都以圆形显示。
网上有好多开源代码,答题思路都是一样的,画一个圆,然后再把图片放上边去,使用PorterDuffXfermode这个类来进行设置,PorterDuffXfermode这个类如何使用,请自行搜索吧。
如何做一个自定义控件就不赘述了。我找了一个网上做好的自定义控件的类,在ondraw中去处理图片,后来发现会出现一些问题,因为ondraw中不能做复杂的操作,否则功能无法实现,需要实现的功能实现不了,所以我把处理图片放到了onSizeChanged(int w, int h, int oldw, int oldh)中区处理,ondraw就处理显示,代码如下:
public class CircleImageView extends View { public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CircleImageView(Context context, AttributeSet attrs) { super(context, attrs); } public CircleImageView(Context context) { super(context); } private Bitmap bitmap; private Paint paint = new Paint(); { paint.setStyle(Paint.Style.STROKE); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setAntiAlias(true);// 设置画笔的锯齿效果 true是去除,大家效果就明白了 } public void setImageBitmap(Bitmap bitmap) { if(this.bitmap==null && bitmap !=null){ this.bitmap=bitmap; } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Bitmap output = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawOval(rectF, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, null, rect, paint); this.bitmap = output; } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, paint); super.onDraw(canvas); }}