android自定义一圆角ImageView-圆角图片

技术分享

public class CircleImageView extendsImageView {
 
    privatestatic final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
 
    privatestatic final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    privatestatic final int COLORDRAWABLE_DIMENSION = 1;
 
    privatestatic final int DEFAULT_BORDER_WIDTH = 0;
    privatestatic final int DEFAULT_BORDER_COLOR = Color.BLACK;
 
    privatefinal RectF mDrawableRect = newRectF();
    privatefinal RectF mBorderRect = newRectF();
 
    privatefinal Matrix mShaderMatrix = newMatrix();
    privatefinal Paint mBitmapPaint = newPaint();
    privatefinal Paint mBorderPaint = newPaint();
 
    privateint mBorderColor = DEFAULT_BORDER_COLOR;
    privateint mBorderWidth = DEFAULT_BORDER_WIDTH;
 
    privateBitmap mBitmap;
    privateBitmapShader mBitmapShader;
    privateint mBitmapWidth;
    privateint mBitmapHeight;
 
    privatefloat mDrawableRadius;
    privatefloat mBorderRadius;
 
    privateboolean mReady;
    privateboolean mSetupPending;
 
    publicCircleImageView(Context context) {
        super(context);
 
        init();
    }
 
    publicCircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
 
    publicCircleImageView(Context context, AttributeSet attrs, intdefStyle) {
        super(context, attrs, defStyle);
 
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle,0);
 
        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
        mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
 
        a.recycle();
 
        init();
    }
 
    privatevoid init() {
        super.setScaleType(SCALE_TYPE);
        mReady = true;
 
        if(mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }
 
    @Override
    publicScaleType getScaleType() {
        returnSCALE_TYPE;
    }
 
    @Override
    publicvoid setScaleType(ScaleType scaleType) {
        if(scaleType != SCALE_TYPE) {
            thrownew IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }
 
    @Override
    protectedvoid onDraw(Canvas canvas) {
        if(getDrawable() == null) {
            return;
        }
 
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        if(mBorderWidth != 0) {
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
        }
    }
 
    @Override
    protectedvoid onSizeChanged(intw, inth, intoldw, intoldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }
 
    publicint getBorderColor() {
        returnmBorderColor;
    }
 
    publicvoid setBorderColor(intborderColor) {
        if(borderColor == mBorderColor) {
            return;
        }
 
        mBorderColor = borderColor;
        mBorderPaint.setColor(mBorderColor);
        invalidate();
    }
 
    publicint getBorderWidth() {
        returnmBorderWidth;
    }
 
    publicvoid setBorderWidth(intborderWidth) {
        if(borderWidth == mBorderWidth) {
            return;
        }
 
        mBorderWidth = borderWidth;
        setup();
    }
 
    @Override
    publicvoid setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }
 
    @Override
    publicvoid setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }
 
    @Override
    publicvoid setImageResource(intresId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }
 
    @Override
    publicvoid setImageURI(Uri uri) {
        super.setImageURI(uri);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }
 
    privateBitmap getBitmapFromDrawable(Drawable drawable) {
        if(drawable == null) {
            returnnull;
        }
 
        if(drawable instanceofBitmapDrawable) {
            return((BitmapDrawable) drawable).getBitmap();
        }
 
        try{
            Bitmap bitmap;
 
            if(drawable instanceofColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            }else{
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }
 
            Canvas canvas = newCanvas(bitmap);
            drawable.setBounds(0,0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            returnbitmap;
        }catch(OutOfMemoryError e) {
            returnnull;
        }
    }
 
    privatevoid setup() {
        if(!mReady) {
            mSetupPending = true;
            return;
        }
 
        if(mBitmap == null) {
            return;
        }
 
        mBitmapShader = newBitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
 
        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setShader(mBitmapShader);
 
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);
 
        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();
 
        mBorderRect.set(0,0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
 
        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
 
        updateShaderMatrix();
        invalidate();
    }
 
    privatevoid updateShaderMatrix() {
        floatscale;
        floatdx = 0;
        floatdy = 0;
 
        mShaderMatrix.set(null);
 
        if(mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
            scale = mDrawableRect.height() / (float) mBitmapHeight;
            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
        }else{
            scale = mDrawableRect.width() / (float) mBitmapWidth;
            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
        }
 
        mShaderMatrix.setScale(scale, scale);
        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
 
        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }
 
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。