首页 > 其他 > 详细

圆形ImageView的实现

时间:2014-03-21 17:40:10      阅读:619      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
 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 }
bubuko.com,布布扣

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裁剪为相应的图形。

圆形ImageView的实现,布布扣,bubuko.com

圆形ImageView的实现

原文:http://www.cnblogs.com/lizebofree/p/3616230.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!