如果图片质量要求不高 图片比较多的话 可以把 ARGB_8888改成 ARGB_4444
避免内存溢出
第一个是原图,第二个是圆形效果,第三第四设置了不同的圆角大小。
准备改变一个博客的风格,首先给大家讲一下原理,让大家明白了,然后再贴代码,不然可以直接看那么长的代码也比较痛苦,核心代码其实就那么几行:
核心代码分析:
复制代码
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
|
/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private
Bitmap createCircleImage(Bitmap source,
int
min)
{
final
Paint paint =
new
Paint();
paint.setAntiAlias(
true
);
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas =
new
Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min /
2
, min /
2
, min /
2
, paint);
/**
* 使用SRC_IN
*/
paint.setXfermode(
new
PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source,
0
,
0
, paint);
return
target;
}
|
1
2
3
4
5
6
7
8
9
10
11
|
canvas.translate(x, y);
canvas.drawBitmap(mDstB,
0
,
0
, paint);
paint.setXfermode(sModes);
canvas.drawBitmap(mSrcB,
0
,
0
, paint);
paint.setXfermode(
null
);
canvas.restoreToCount(sc);
|
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
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
attr
name
=
"borderRadius"
format
=
"dimension"
/>
<
attr
name
=
"type"
>
<
enum
name
=
"circle"
value
=
"0"
/>
<
enum
name
=
"round"
value
=
"1"
/>
</
attr
>
<
attr
name
=
"src"
format
=
"reference"
></
attr
>
<
declare-styleable
name
=
"CustomImageView"
>
<
attr
name
=
"borderRadius"
/>
<
attr
name
=
"type"
/>
<
attr
name
=
"src"
/>
</
declare-styleable
>
</
resources
>
|
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/**
* TYPE_CIRCLE / TYPE_ROUND
*/
private
int
type;
private
static
final
int
TYPE_CIRCLE =
0
;
private
static
final
int
TYPE_ROUND =
1
;
/**
* 图片
*/
private
Bitmap mSrc;
/**
* 圆角的大小
*/
private
int
mRadius;
/**
* 控件的宽度
*/
private
int
mWidth;
/**
* 控件的高度
*/
private
int
mHeight;
public
CustomImageView(Context context, AttributeSet attrs)
{
this
(context, attrs,
0
);
}
public
CustomImageView(Context context)
{
this
(context,
null
);
}
/**
* 初始化一些自定义的参数
*
* @param context
* @param attrs
* @param defStyle
*/
public
CustomImageView(Context context, AttributeSet attrs,
int
defStyle)
{
super
(context, attrs, defStyle);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle,
0
);
int
n = a.getIndexCount();
for
(
int
i =
0
; i < n; i++)
{
int
attr = a.getIndex(i);
switch
(attr)
{
case
R.styleable.CustomImageView_src:
mSrc = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr,
0
));
break
;
case
R.styleable.CustomImageView_type:
type = a.getInt(attr,
0
);
// 默认为Circle
break
;
case
R.styleable.CustomImageView_borderRadius:
mRadius= a.getDimensionPixelSize(attr, (
int
) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
getResources().getDisplayMetrics()));
// 默认为10DP
break
;
}
}
a.recycle();
}
|
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
|
/**
* 计算控件的高度和宽度
*/
@Override
protected
void
onMeasure(
int
widthMeasureSpec,
int
heightMeasureSpec)
{
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/**
* 设置宽度
*/
int
specMode = MeasureSpec.getMode(widthMeasureSpec);
int
specSize = MeasureSpec.getSize(widthMeasureSpec);
if
(specMode == MeasureSpec.EXACTLY)
// match_parent , accurate
{
mWidth = specSize;
}
else
{
// 由图片决定的宽
int
desireByImg = getPaddingLeft() + getPaddingRight() + mSrc.getWidth();
if
(specMode == MeasureSpec.AT_MOST)
// wrap_content
{
mWidth = Math.min(desireByImg, specSize);
}
}
/***
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if
(specMode == MeasureSpec.EXACTLY)
// match_parent , accurate
{
mHeight = specSize;
}
else
{
int
desire = getPaddingTop() + getPaddingBottom() + mSrc.getHeight();
if
(specMode == MeasureSpec.AT_MOST)
// wrap_content
{
mHeight = Math.min(desire, specSize);
}
}
setMeasuredDimension(mWidth, mHeight);
}
|
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
/**
* 绘制
*/
@Override
protected
void
onDraw(Canvas canvas)
{
switch
(type)
{
// 如果是TYPE_CIRCLE绘制圆形
case
TYPE_CIRCLE:
int
min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
mSrc = Bitmap.createScaledBitmap(mSrc, min, min,
false
);
canvas.drawBitmap(createCircleImage(mSrc, min),
0
,
0
,
null
);
break
;
case
TYPE_ROUND:
canvas.drawBitmap(createRoundConerImage(mSrc),
0
,
0
,
null
);
break
;
}
}
/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private
Bitmap createCircleImage(Bitmap source,
int
min)
{
final
Paint paint =
new
Paint();
paint.setAntiAlias(
true
);
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas =
new
Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min /
2
, min /
2
, min /
2
, paint);
/**
* 使用SRC_IN,参考上面的说明
*/
paint.setXfermode(
new
PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
|