1 import android.content.Context; 2 import android.graphics.Paint; 3 import android.graphics.PaintFlagsDrawFilter; 4 import android.graphics.Path; 5 import android.util.AttributeSet; 6 import android.widget.ImageView; 7 8 import android.graphics.Canvas; 9 import android.graphics.Color; 10 import android.graphics.Region; 11 12 /** 13 * 14 * android circle imageView 15 * 16 * 17 */ 18 public class CircleImageView extends ImageView { 19 20 Path path; 21 public PaintFlagsDrawFilter mPaintFlagsDrawFilter;// 毛边过滤 22 Paint paint; 23 24 public CircleImageView(Context context, AttributeSet attrs, int defStyle) { 25 super(context, attrs, defStyle); 26 // TODO Auto-generated constructor stub 27 init(); 28 } 29 30 public CircleImageView(Context context, AttributeSet attrs) { 31 super(context, attrs); 32 // TODO Auto-generated constructor stub 33 init(); 34 } 35 36 public CircleImageView(Context context) { 37 super(context); 38 // TODO Auto-generated constructor stub 39 init(); 40 } 41 42 public void init() { 43 mPaintFlagsDrawFilter = new PaintFlagsDrawFilter(0, 44 Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); 45 paint = new Paint(); 46 paint.setAntiAlias(true); 47 paint.setFilterBitmap(true); 48 paint.setColor(Color.WHITE); 49 50 } 51 52 @Override 53 protected void onDraw(Canvas cns) { 54 // TODO Auto-generated method stub 55 float h = getMeasuredHeight(); 56 float w = getMeasuredWidth(); 57 if (path == null) { 58 path = new Path(); 59 path.addCircle(w / 2.0f, h / 2.0f, 60 (float) Math.min(w / 2.0f, (h / 2.0f)), Path.Direction.CCW); 61 path.close(); 62 } 63 cns.drawCircle(w / 2.0f, h / 2.0f, Math.min(w / 2.0f, h / 2.0f), paint); 64 int saveCount = cns.getSaveCount(); 65 cns.save(); 66 cns.setDrawFilter(mPaintFlagsDrawFilter); 67 cns.clipPath(path, Region.Op.REPLACE); 68 cns.setDrawFilter(mPaintFlagsDrawFilter); 69 cns.drawColor(Color.WHITE); 70 super.onDraw(cns); 71 cns.restoreToCount(saveCount); 72 } 73 74 }
Paint是android的画笔,一般用来设置一些包括颜色之类的属性;path是路径,一般用于一些几何图形的绘制;PaintFlagsDrawFilter用于设置抗锯齿.
PaintFlagsDrawFilter用于设置Canvas DrawFilter属性, DrawFilter官方文档中的功能介绍是A DrawFilter subclass can be installed in a Canvas. When it is present, it can modify the paint that is used to draw (temporarily). With this, a filter can disable/enable antialiasing, or change the color for everything this is drawn.大概是说其用来设置Canvas的一些过滤效果,比如抗锯齿和颜色过滤等;
继承View需要实现onDraw方法
clipPath方法是裁剪画布,其第一个参数为裁剪路径,第二个参数Region.Op是个枚举类型,其值包括:DIFFERENCE、INTERSECT、REPLACE、REVERSE_DIFFERENCE、UNION、XOR;
类似的方法还有clipRect、clipRegion
save、getSaveCount和restoreToCount这一组方法是用于保存和恢复canvas一些matrix、clip的操作。
基本思想就是画出圆形path,然后将Canvas裁剪为相应的图形。
原文:http://www.cnblogs.com/lizebofree/p/3616230.html