1
2
3
4
5
6
|
private void init(){
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundRect = new RectF( 0 , 0 , getWidth() , getHeight());
radius = 40 ;
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ;
}
|
继承ImageView,在构造方法中调用,初始化Paint和Xfermode。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
protected void onDraw(Canvas canvas) {
int sc = canvas.saveLayer( 0 , 0 , getWidth() , getHeight(), null ,
Canvas.MATRIX_SAVE_FLAG |
Canvas.CLIP_SAVE_FLAG |
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
Canvas.CLIP_TO_LAYER_SAVE_FLAG);
roundRect.set( 0 , 0 , getWidth(), getHeight());
canvas.drawRoundRect(roundRect, radius, radius, paint);
reflectSetXfermod();
super .onDraw(canvas);
canvas.restoreToCount(sc);
}
|
重写ImageView的onDraw方法,通过xfermode实现圆角
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
|
private void reflectSetXfermod(){
Drawable drawable = getDrawable();
if (drawable == null ){
return ;
}
Class bsClass = null ;
Class[] innerClasses = BitmapDrawable. class .getDeclaredClasses();
for (Class innerClass :innerClasses)
{
String name = innerClass.getName();
System.out.println( "-----innerClass---" +name);
if (name.equals( "android.graphics.drawable.BitmapDrawable$BitmapState" ))
{
bsClass = innerClass;
}
}
if (bsClass!= null ){
try {
Field mPaintField = bsClass.getDeclaredField( "mPaint" );
mPaintField.setAccessible( true );
ConstantState constantState = ((BitmapDrawable)drawable).getConstantState();
Paint paint = (Paint)mPaintField.get(constantState);
paint.setXfermode(mPorterDuffXfermode);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
通过反射的方法将xfermode设置到BitmapDrawable 里面的内部类BitmapState里的对象mPaint,用来绘制图片。