android画布裁剪圆角,android – 如何使用中心裁剪创建部分圆角矩形可绘制而不创建新位图?...

这篇博客探讨了如何在不创建新位图的情况下为位图的特定角落添加圆角,并使其适用于中心裁剪的ImageView。现有的解决方案包括使用BitmapShader和自定义Drawable,但它们会导致额外的位图创建。作者寻求一种方法,能直接操作原始位图,同时保持位图的宽高比,并在ImageView中显示带圆角和边框的位图。
摘要由CSDN通过智能技术生成

背景

我已经看过如何用位图创建一个圆形的drawable,以及如何在它周围添加一个轮廓(AKA笔划),here.

问题

我无法找到如何在不绘制新位图的情况下仅对位图的某些角进行舍入,而不是创建新的位图,并且仍然可以用于中心裁剪ImageView.

我发现了什么

这是我发现的,但它确实创建了一个新的位图,并在带有center-crop的imageView中使用它(源here):

/**

* Create rounded corner bitmap from original bitmap.

*

* @param input Original bitmap.

* @param cornerRadius Corner radius in pixel.

* @param squareTL,squareTR,squareBL,squareBR where to use square corners instead of rounded ones.

*/

public static Bitmap getRoundedCornerBitmap(final Bitmap input,final float cornerRadius,final int w,final int h,final boolean squareTL,final boolean squareTR,final boolean squareBL,final boolean squareBR) {

final Bitmap output = Bitmap.createBitmap(w,h,Config.ARGB_8888);

final Canvas canvas = new Canvas(output);

final int color = 0xff424242;

final Rect rect = new Rect(0,w,h);

final RectF rectF = new RectF(rect);

// make sure that our rounded corner is scaled appropriately

Paint paint = new Paint();

paint.setXfermode(null);

paint.setAntiAlias(true);

canvas.drawARGB(0,0);

paint.setColor(color);

canvas.drawRoundRect(rectF,cornerRadius,paint);

// draw rectangles over the corners we want to be square

if (squareTL)

canvas.drawRect(0,w / 2,h / 2,paint);

if (squareTR)

canvas.drawRect(w / 2,paint);

if (squareBL)

canvas.drawRect(0,paint);

if (squareBR)

canvas.drawRect(w / 2,paint);

paint.setXfermode(PORTER_DUFF_XFERMODE_SRC_IN);

canvas.drawBitmap(input,paint);

return output;

}

而且,这是我发现创建一个可以在各个角落起作用的圆角可绘制的东西:

public static class RoundedCornersDrawable extends Drawable {

private final float mCornerRadius;

private final RectF mRect = new RectF();

private final BitmapShader mBitmapShader;

private final Paint mPaint;

public RoundedCornersDrawable(final Bitmap bitmap,final float cornerRadius) {

mCornerRadius = cornerRadius;

mBitmapShader = new BitmapShader(bitmap,Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);

mPaint = new Paint();

mPaint.setAntiAlias(false);

mPaint.setShader(mBitmapShader);

mRect.set(0,bitmap.getWidth(),bitmap.getHeight());

}

@Override

protected void onBoundsChange(final Rect bounds) {

super.onBoundsChange(bounds);

mRect.set(0,bounds.width(),bounds.height());

}

@Override

public void draw(final Canvas canvas) {

canvas.drawRoundRect(mRect,mCornerRadius,mPaint);

}

@Override

public int getOpacity() {

return PixelFormat.TRANSLUCENT;

}

@Override

public void setAlpha(final int alpha) {

mPaint.setAlpha(alpha);

}

@Override

public void setColorFilter(final ColorFilter cf) {

mPaint.setColorFilter(cf);

}

}

但是,如果imageView显示内容,同时保持与位图相同的宽高比,并且其大小也是预先确定的,则此解决方案才有效.

这个问题

如何创建一个中心裁剪的drawable,它显示一个位图,具有特定角落的圆角,并且还能够显示它周围的轮廓/笔划?

我想这样做而不创建新的位图或扩展ImageView.仅使用具有位图作为输入的drawable.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值