17 自定义属性及圆角imageView
1 public class RoundAngleImageView extends ImageView { 2 //cn.dpocket.moplusand.uinew是app的包名 manifest文件里面 3 private static final String NAMESPACE = "http://schemas.android.com/apk/res/cn.dpocket.moplusand.uinew"; 4 private Paint paint; 5 //如果不在xml属性里面设置自定义属性 默认值为5dp 6 private int roundWidth = 5; 7 private int roundHeight = 5; 8 private Paint paint2; 9 public RoundAngleImageView(Context context) { 10 super(context); 11 init(context,null); 12 } 13 14 public RoundAngleImageView(Context context, AttributeSet attrs) { 15 super(context, attrs); 16 init(context,attrs); 17 } 18 19 private void init(Context context, AttributeSet attrs) { 20 21 if(attrs != null) { 22 roundWidth= attrs.getAttributeIntValue(NAMESPACE,"roundWidth",0); 23 roundHeight= attrs.getAttributeIntValue(NAMESPACE, "roundHeight", 0); 24 }else { 25 float density = context.getResources().getDisplayMetrics().density; 26 roundWidth = (int) (roundWidth*density); 27 roundHeight = (int) (roundHeight*density); 28 } 29 30 paint = new Paint(); 31 paint.setColor(Color.WHITE); 32 paint.setAntiAlias(true); 33 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 34 35 paint2 = new Paint(); 36 paint2.setXfermode(null); 37 } 38 39 @Override 40 public void draw(Canvas canvas) { 41 Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 42 Canvas canvas2 = new Canvas(bitmap); 43 super.draw(canvas2); 44 drawLiftUp(canvas2); 45 drawRightUp(canvas2); 46 drawLiftDown(canvas2); 47 drawRightDown(canvas2); 48 canvas.drawBitmap(bitmap, 0, 0, paint2); 49 bitmap.recycle(); 50 } 51 52 private void drawLiftUp(Canvas canvas) { 53 Path path = new Path(); 54 path.moveTo(0, roundHeight); 55 path.lineTo(0, 0); 56 path.lineTo(roundWidth, 0); 57 path.arcTo(new RectF( 58 0, 59 0, 60 roundWidth*2, 61 roundHeight*2), 62 -90, 63 -90); 64 path.close(); 65 canvas.drawPath(path, paint); 66 } 67 68 private void drawLiftDown(Canvas canvas) { 69 Path path = new Path(); 70 path.moveTo(0, getHeight()-roundHeight); 71 path.lineTo(0, getHeight()); 72 path.lineTo(roundWidth, getHeight()); 73 path.arcTo(new RectF( 74 0, 75 getHeight()-roundHeight*2, 76 0+roundWidth*2, 77 getHeight()), 78 90, 79 90); 80 path.close(); 81 canvas.drawPath(path, paint); 82 } 83 84 private void drawRightDown(Canvas canvas) { 85 Path path = new Path(); 86 path.moveTo(getWidth()-roundWidth, getHeight()); 87 path.lineTo(getWidth(), getHeight()); 88 path.lineTo(getWidth(), getHeight()-roundHeight); 89 path.arcTo(new RectF( 90 getWidth()-roundWidth*2, 91 getHeight()-roundHeight*2, 92 getWidth(), 93 getHeight()), 0, 90); 94 path.close(); 95 canvas.drawPath(path, paint); 96 } 97 98 private void drawRightUp(Canvas canvas) { 99 Path path = new Path(); 100 path.moveTo(getWidth(), roundHeight); 101 path.lineTo(getWidth(), 0); 102 path.lineTo(getWidth()-roundWidth, 0); 103 path.arcTo(new RectF( 104 getWidth()-roundWidth*2, 105 0, 106 getWidth(), 107 0+roundHeight*2), 108 -90, 109 90); 110 path.close(); 111 canvas.drawPath(path, paint); 112 } 113 }
定义一个attr.xml的文件,放在values目录下面,内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <declare-styleable name="RoundAngleImageView"> 4 <attr name="roundWidth" format="integer" /> 5 <attr name="roundHeight" format="integer" /> 6 </declare-styleable> 7 </resources>
在布局文件的跟布局中 加入如下代码:
//cn.dpocket.moplusand.uinew是app的包名 manifest文件中
xmlns:app="http://schemas.android.com/apk/res/cn.dpocket.moplusand.uinew"
1 <cn.dpocket.moplusand.uinew.widget.RoundAngleImageView 2 android:id="@+id/iv_head1" 3 android:layout_width="68dp" 4 android:layout_height="68dp" 5 app:roundWidth="8" 6 app:roundHeight="8" 7 ></cn.dpocket.moplusand.uinew.widget.RoundAngleImageView>