Android 自定義圓角圖片/頭像
之前多次做項(xiàng)目要用圓角圖片都去網(wǎng)上找現(xiàn)成的。
今天想想不行,還是得自己學(xué)會(huì),所以就自定義了一個(gè),集成自ImageView,
效果如圖:
?
代碼如下:
import?android.content.Context; import?android.content.res.TypedArray; import?android.graphics.Bitmap; import?android.graphics.Canvas; import?android.graphics.Paint; import?android.graphics.PorterDuff; import?android.graphics.PorterDuffXfermode; import?android.graphics.RectF; import?android.graphics.drawable.BitmapDrawable; import?android.util.AttributeSet; import?android.widget.ImageView; import?com.eccic.quicksolve_android.R; /** ?*?Created?by?eccic?on?17/1/3. ?*/ public?class?RoundImageView?extends?ImageView?{ ????public?RoundImageView(Context?context)?{ ????????this(context,?null); ????} ????private?float?cornerRadius?=?-1; ????private?Paint?paint?=?new?Paint(Paint.ANTI_ALIAS_FLAG); ????public?RoundImageView(Context?context,?AttributeSet?attrs)?{ ????????super(context,?attrs); ????????TypedArray?typedArray?=?context.obtainStyledAttributes(attrs,?R.styleable.RoundImageView); ????????for?(int?i?=?0;?i?<?typedArray.getIndexCount();?i++)?{ ????????????switch?(typedArray.getIndex(i))?{ ????????????????case?R.styleable.RoundImageView_cornerRadius: ????????????????????cornerRadius?=?typedArray.getDimension(R.styleable.RoundImageView_cornerRadius,?cornerRadius); ????????????????????break; ????????????} ????????} ????} ????@Override ????protected?void?onDraw(Canvas?canvas)?{ ????????if?(cornerRadius?<?0)?cornerRadius?=?Math.min(getWidth(),?getHeight())?*?0.5f; ????????BitmapDrawable?bitmapDrawable?=?(BitmapDrawable)?getDrawable(); ????????if?(bitmapDrawable?!=?null)?{ ????????????//步驟1:先生成一個(gè)bitmap,在bitmap上繪制原圖 ????????????Bitmap?bitmap?=?Bitmap.createBitmap(getWidth(),getHeight(),?Bitmap.Config.ARGB_8888); ????????????Canvas?bitmapCanvas?=?new?Canvas(bitmap); ????????????bitmapDrawable.setBounds(0,?0,?getWidth(),?getHeight()); ????????????bitmapDrawable.draw(bitmapCanvas); ????????????//步驟2:生成圓形圖片蒙版 ????????????Bitmap?mask?=?Bitmap.createBitmap(getWidth(),?getHeight(),Bitmap.Config.ARGB_8888); ????????????Canvas?maskCanvas?=?new?Canvas(mask); ????????????maskCanvas.drawRoundRect(new?RectF(0,?0,?getWidth(),?getHeight()),?cornerRadius,?cornerRadius,?paint); ????????????//步驟3:使用DST_IN的方式在原圖的bitmap上繪制蒙版圖 ????????????paint.reset(); ????????????paint.setFilterBitmap(false); ????????????paint.setXfermode(new?PorterDuffXfermode(PorterDuff.Mode.DST_IN)); ????????????bitmapCanvas.drawBitmap(mask,?0.0f,?0.0f,?paint); ????????????//步驟4:將最后生成的這個(gè)bitmap繪制到View的canvas上 ????????????if?(bitmap?!=?null)?{ ????????????????paint.setXfermode(null); ????????????????canvas.drawBitmap(bitmap,?0.0f,?0.0f,?paint); ????????????} ????????} ????} }