hxb
2022-11-22 b3513b1713bb979d0a69c5a8c4ddcd038f184e6e
1
2
3
4
5
6
7
8
9
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
package com.mm.android.deviceaddmodule.mobilecommon.widget;
 
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
 
import com.mm.android.deviceaddmodule.R;
 
 
/**
 * 自定义 ImageView 控件,实现了圆角和边框,以及按下变色
 *
 * 修改设置选中 颜色和 按下颜色 的方法 ,通过系统api调用, 移除java代码依赖, 只需要依赖xml和attr配置
 */
public class FilletCornerImageView extends android.support.v7.widget.AppCompatImageView {
    // 图片的宽高
    private int width;
    private int height;
    // 圆角半径
    private int radius;
    private Path mPath;
    public FilletCornerImageView(Context context) {
        super(context);
        init(context, null);
    }
 
    public FilletCornerImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }
 
    public FilletCornerImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }
 
    private void init(Context context, AttributeSet attrs) {
        //初始化默认值
        mPath = new Path();
        radius = 16;
        // 获取控件的属性值
        if (attrs != null) {
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.FilletCornerImageView);
            radius = array.getDimensionPixelOffset(R.styleable.FilletCornerImageView_fillet_radius, radius);
            array.recycle();
        }
 
        setClickable(true);
        setDrawingCacheEnabled(true);
        setWillNotDraw(false);
    }
    Paint paint = new Paint();
 
    @Override
    protected void onDraw(Canvas canvas) {
 
        if(width<radius || height<radius){
            super.onDraw(canvas);
            return;
        }
        // 颜色设置
        paint.setColor(0xffffffff);
        // 抗锯齿
        paint.setAntiAlias(true);
        mPath.moveTo(radius,0);
        mPath.lineTo(width-radius,0);
        mPath.quadTo(width,0,width,radius);
        mPath.lineTo(width,height-radius);
        mPath.quadTo(width,height,width-radius,height);
        mPath.lineTo(radius,height);
        mPath.quadTo(0,height,0,height-radius);
        mPath.lineTo(0,radius);
        mPath.quadTo(0,0,radius,0);
        canvas.clipPath(mPath);
        super.onDraw(canvas);
    }
 
    /**
     * 重写父类的 onSizeChanged 方法,检测控件宽高的变化
     *
     * @param w
     * @param h
     * @param oldw
     * @param oldh
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
    }
 
}