1. 程式人生 > >自定義形狀的ImageView

自定義形狀的ImageView

通過給定的Mask來確定顯示圖片的形狀

直接貼上程式碼

/**
 * @author Momo
 * */
public class XCRoundImageView extends ImageView {
    private Paint paint;

    public XCRoundImageView(Context context) {
        this(context, null);
    }

    public XCRoundImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0
); } public XCRoundImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); paint = new Paint(); } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (null != drawable) { //獲得原始image
Bitmap src = ((BitmapDrawable) drawable).getBitmap(); //建立矩陣來放大或者縮小原始圖片 //postScale(<這裡面為放大或者縮小的引數>) Matrix matrix = new Matrix(); float srcLength = pxTodp(Math.min(src.getWidth(),src.getHeight())); matrix.postScale(1 / (srcLength / 44
), 1 / (srcLength / 44)); //獲得mask //quick_settings_personal_center_mask -->這裡是mask的資原始檔 Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.quick_settings_personal_center_mask); //建立符合要求大小的原始圖片 Bitmap bitmap = Bitmap.createBitmap(((BitmapDrawable) drawable).getBitmap(), 0, 0, src.getWidth(),src.getHeight(),matrix,true); //設定層級 int sr = canvas.saveLayer(0, 0, src.getWidth(),src.getHeight(), null, Canvas.ALL_SAVE_FLAG); canvas.drawBitmap(bitmap,0,0,paint); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); canvas.drawBitmap(mask, 0, 0, paint); paint.setXfermode(null); canvas.restoreToCount(sr); } else { super.onDraw(canvas); } } public int pxTodp(float px){ final float scale = getContext().getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); }