android 图片圆角化控件

最近项目有个需求,是把图片缩放成圆形,头像都以圆形显示。

网上有好多开源代码,答题思路都是一样的,画一个圆,然后再把图片放上边去,使用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);
	  }
}

  

posted on 2014-04-24 17:44  nolan-真岚  阅读(248)  评论(0)    收藏  举报

导航