ImageView圆角遮罩

来源:互联网 发布:gson解析json多个数组 编辑:程序博客网 时间:2024/05/19 08:23
重写了ImageView实现了圆角遮罩效果,不需要额外的资源文件,
CircleImageView为了节约内存,没有对图片进行切割,仅仅在onDraw方法中画了一层背景色,所以没法实现透明效果。
截屏:
 
CircleImageView的代码如下:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
 * ImageView圆形遮罩处理
 * background设置遮罩颜色
 * tag设置圆的边框色
 * padding设置圆形线宽
 * @author planet
 *
 */
publicclassCircleImageView extendsImageView {
publicCircleImageView(Context context) {
                super(context);
                initColor(null);
        }
        publicCircleImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                initColor(attrs);
        }
        publicCircleImageView(Context context, AttributeSet attrs,
                        intdefStyle) {
                super(context, attrs, defStyle);
                initColor(attrs);
        }
 
        privatePaint paint;
        privatePath path;
        privatebooleaninit = false;
        privateintbackground = Color.WHITE;
        privateintcircleLineWidth = 6;
        privateintcircleColor = Color.RED;
 
        privatevoidinitColor(AttributeSet attrs){
                if(attrs != null){
                        String v = attrs.getAttributeValue("http://schemas.android.com/apk/res/android","background");
                        if(v != null){
                                if(v.startsWith("#")){
                                        background = Color.parseColor(v);
                                }else{
                                        background = getResources().getColor(Integer.parseInt(v.replaceAll("@","")));
                                }
                        }
                }
        }
 
        @Override
        protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                if(!init){
                        initPaint();
                }
        }
 
        privatevoidinitPaint(){
                circleLineWidth = getPaddingLeft();
                setPadding(0,0,0,0);
                paint = newPaint();
                paint.setStyle(Style.FILL);
                paint.setColor(background);
                //paint.setColor(Color.TRANSPARENT);
                paint.setAntiAlias(true);
                //paint.setStrokeWidth(2);
                //paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
                //Log.i(VIEW_LOG_TAG, "22>>>>>>>>>>>>>>>>>>>>3getPaddingBottom()="+getPaddingBottom());
                intwidth = getMeasuredWidth();
                floatradius = width/(float)2;
 
                path = newPath();
                Log.i(VIEW_LOG_TAG,"moveto 0,"+radius);
                path.moveTo(0, radius);
                Log.i(VIEW_LOG_TAG,"lineto 0,0");
                path.lineTo(0,0);
                Log.i(VIEW_LOG_TAG,"lineto "+width+",0");
                path.lineTo(width,0);
                Log.i(VIEW_LOG_TAG,"lineto "+width+","+width);
                path.lineTo(width, width);
                Log.i(VIEW_LOG_TAG,"lineto 0,"+width);
                path.lineTo(0, width);
                Log.i(VIEW_LOG_TAG,"lineto 0,"+radius);
                path.lineTo(0, radius);
                //圆弧左边中间起点是180,旋转360度
                //Log.i(VIEW_LOG_TAG, "arcto 0,0,"+width+","+width);
                path.arcTo(newRectF(0,0, width, width), 180, -359,true);
                //path.addCircle(radius, radius, radius, Direction.CW);
                path.close();
                try{
                        circleColor = Color.parseColor((String) getTag());
                }catch(Exception e) {
                        e.printStackTrace();
                }
                init = true;
        }
 
        @Override
        protectedvoidonDraw(Canvas canvas) {
                super.onDraw(canvas);
                paint.setColor(background);
                paint.setStyle(Style.FILL);
                canvas.drawPath(path, paint);
                paint.setColor(circleColor);
                paint.setStyle(Style.STROKE);
                paint.setStrokeWidth(circleLineWidth);
                intwidth = getMeasuredHeight();
                canvas.drawCircle(width/2, width/2, (float) (width/2-circleLineWidth*.5), paint);
        }
}


ClipCircleImageView在内存中对ImageView绘画进行了处理,我感觉比较浪费内存,一般情况下有背景色的用前一种够用了。
ClipCircleImageView的代码如下:
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
 * ImageView圆形切割处理(感觉比较浪费内存,一般情况下使用CircleImageView足够了)
 * padding代表圆形边框线粗,background代表圆形边框的颜色
 * @author planet
 *
 */
publicclassClipCircleImageView extendsImageView {
        publicClipCircleImageView(Context context) {
                super(context);
        }
        publicClipCircleImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                initColor(attrs);
        }
        publicClipCircleImageView(Context context, AttributeSet attrs,
                        intdefStyle) {
                super(context, attrs, defStyle);
                initColor(attrs);
        }
 
        privateintbackground = Color.WHITE;
        privatePaint paint;
        privatebooleanset = false;
        privateintpadding = 0;
 
        privatevoidinitColor(finalAttributeSet attrs){
                if(attrs != null){
                        String v = attrs.getAttributeValue("http://schemas.android.com/apk/res/android","background");
                        if(v != null){
                                if(v.startsWith("#")){
                                        background = Color.parseColor(v);
                                }else{
                                        background = getResources().getColor(Integer.parseInt(v.replaceAll("@","")));
                                }
                        }
                }
                setBackgroundResource(android.R.color.transparent);
                paint = newPaint();
                paint.setColor(background);
                paint.setAntiAlias(true);
                paint.setStyle(Style.STROKE);
                padding = getPaddingLeft();
                setPadding(0,0,0,0);
        }
 
        @Override
        publicvoidsetImageBitmap(finalBitmap bm) {
                post(newRunnable() {
                        @Override
                        publicvoidrun() {
                                set = true;
                                ClipCircleImageView.super.setImageBitmap(getCroppedBitmap(bm));
                        }
                });
        }
 
        @Override
        protectedvoidonDraw(Canvas canvas) {
                if(!set){
                        set = true;
                        setImageBitmap(getCroppedBitmap(((BitmapDrawable) getDrawable()).getBitmap()));
                }
                super.onDraw(canvas);
                paint.setStrokeWidth(padding);
                canvas.drawCircle(getMeasuredWidth()/2, getMeasuredWidth()/2, (float) (getMeasuredWidth()*.5-padding*.5), paint);
        }
 
        publicBitmap getCroppedBitmap(Bitmap bitmap) {
                intwidth = getMeasuredWidth();
                //int height = getMeasuredHeight();
                Bitmap output = Bitmap.createBitmap(width,
                                width, Config.ARGB_8888);
                Canvas canvas = newCanvas(output);
 
                finalintcolor = 0xff424242;
                finalPaint paint = newPaint();
                finalRect rect = newRect(0,0, width, width);
 
                paint.setAntiAlias(true);
                canvas.drawARGB(0,0,0,0);
                paint.setColor(color);
                // canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
                canvas.drawCircle(width / 2, width / 2,
                                width / 2, paint);
                paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
                //bitmap = ImageTool.scale(width, bitmap);
                canvas.drawBitmap(bitmap, rect, rect, paint);
                returnoutput;
        }
}

0 0
原创粉丝点击