1
I’m using a code to make the Imageview circular. The problem is that I need to use "scaleType:centerCrop", what leaves the image oval instead of circular, depending on its resolution.
I tried to use the code below to resize the image, but it ends up losing a lot of quality. I’ve been thinking instead of resizing, show just what the Imageview can show. That is, if the Imageview has 150px for 150px, will only show 150px/150px image, ignoring the rest. But I don’t know how I can do this.
Code to resize:
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight){
    int Width = bm.getWidth();
    int Height = bm.getHeight();
    float scaleWidth = ((float) newWidth / Width);
    float scaleHeight = ((float) newHeight / Height);
    //Create a matrix for manipulation
    Matrix matrix = new Matrix();
    //Resize the bitmap
    matrix.postScale(scaleWidth, scaleHeight);
    //Recreate bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap
            ( bm, 0, 0, Width, Height, matrix, false );
    bm.recycle();
    return resizedBitmap;
}
Here’s the class I use to make Imageview circular:
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
public class RoundImage extends Drawable {
    private final Bitmap mBitmap;
    private final Paint mPaint;
    private final RectF mRectF;
    private final int mBitmapWidth;
    private final int mBitmapHeight;
    public RoundImage(Bitmap bitmap) {
        mBitmap = bitmap;
        mRectF = new RectF();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        final BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint.setShader(shader);
        mBitmapWidth = mBitmap.getWidth();
        mBitmapHeight = mBitmap.getHeight();
    }
    @Override
    public void draw(Canvas canvas) {
        canvas.drawOval(mRectF, mPaint);
    }
    @Override
    protected void onBoundsChange(Rect bounds) {
        super.onBoundsChange(bounds);
        mRectF.set(bounds);
    }
    @Override
    public void setAlpha(int alpha) {
        if (mPaint.getAlpha() != alpha) {
            mPaint.setAlpha(alpha);
            invalidateSelf();
        }
    }
    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }
    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
    @Override
    public int getIntrinsicWidth() {
        return mBitmapWidth;
    }
    @Override
    public int getIntrinsicHeight() {
        return mBitmapHeight;
    }
    public void setAntiAlias(boolean aa) {
        mPaint.setAntiAlias(aa);
        invalidateSelf();
    }
    @Override
    public void setFilterBitmap(boolean filter) {
        mPaint.setFilterBitmap(filter);
        invalidateSelf();
    }
    @Override
    public void setDither(boolean dither) {
        mPaint.setDither(dither);
        invalidateSelf();
    }
    public Bitmap getBitmap() {
        return mBitmap;
    }
}
						
It is probably leaving the image oval when the image has one of the dimensions (width or height) larger than the other, have you ever tried to cut the image to form a perfect square before resizing? for example: the original image was 160px by 150px, ai vc cut in width 5px on each side to stay with 150 x 150
– Julio Borges