package pl.droidsonroids.gif.transforms; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.support.annotation.FloatRange; /** * {@link Transform} which adds rounded corners. */ public class CornerRadiusTransform implements Transform { private float mCornerRadius; private Shader mShader; private final RectF mDstRectF = new RectF(); /** * @param cornerRadius corner radius, may be 0. */ public CornerRadiusTransform(@FloatRange(from = 0) float cornerRadius) { setCornerRadius(cornerRadius); } /** * Sets the corner radius to be applied when drawing the bitmap. * * @param cornerRadius corner radius or 0 to remove rounding */ public void setCornerRadius(@FloatRange(from = 0) float cornerRadius) { cornerRadius = Math.max(0, cornerRadius); if (cornerRadius == mCornerRadius) { return; } mCornerRadius = cornerRadius; mShader = null; } /** * @return The corner radius applied when drawing this drawable. 0 when drawable is not rounded. */ @FloatRange(from = 0) public float getCornerRadius() { return mCornerRadius; } @Override public void onBoundsChange(Rect bounds) { mDstRectF.set(bounds); mShader = null; } @Override public void onDraw(Canvas canvas, Paint paint, Bitmap buffer) { if (mCornerRadius == 0) { canvas.drawBitmap(buffer, null, mDstRectF, paint); return; } if (mShader == null) { mShader = new BitmapShader(buffer, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); final Matrix shaderMatrix = new Matrix(); shaderMatrix.setTranslate(mDstRectF.left, mDstRectF.top); shaderMatrix.preScale(mDstRectF.width() / buffer.getWidth(), mDstRectF.height() / buffer.getHeight()); mShader.setLocalMatrix(shaderMatrix); } paint.setShader(mShader); canvas.drawRoundRect(mDstRectF, mCornerRadius, mCornerRadius, paint); } }