Android 如何将位图转换为RoundRect位图? 我正在尝试将位图转换为RoundRect形状。我很困惑如何使用它

Android 如何将位图转换为RoundRect位图? 我正在尝试将位图转换为RoundRect形状。我很困惑如何使用它,android,canvas,bitmap,drawable,paint,Android,Canvas,Bitmap,Drawable,Paint,如果我先抽出来就可以了 public Bitmap transform(Bitmap bitmap) { Drawable drawable = new BitmapDrawable(Resources.getSystem(), bitmap); Bitmap destBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canv

如果我先抽出来就可以了

public Bitmap transform(Bitmap bitmap) {
  Drawable drawable =  new BitmapDrawable(Resources.getSystem(), bitmap);
  Bitmap destBitmap = Bitmap.createBitmap(bitmap.getWidth(), 
  bitmap.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(destBitmap);
  Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  RectF srcRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
  canvas.drawRoundRect(srcRect, mRadiusX, mRadiusY,  paint);
  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  canvas.saveLayer(srcRect, paint, Canvas.ALL_SAVE_FLAG);
  drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
  drawable.draw(canvas);
  canvas.restore();
  return destBitmap;
}

但是,如果我先画位图就不行了。为什么?

public Bitmap transform(Bitmap bitmap) {
  Drawable drawable =  new BitmapDrawable(Resources.getSystem(), bitmap);
  Bitmap destBitmap = Bitmap.createBitmap(bitmap.getWidth(), 
  bitmap.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(destBitmap);
  Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
  RectF srcRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
  drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
  drawable.draw(canvas);
  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
  canvas.saveLayer(srcRect, paint, Canvas.ALL_SAVE_FLAG);
  canvas.drawRoundRect(srcRect, mRadiusX, mRadiusY,  paint);
  canvas.restore();
  return destBitmap;
}

另外,我不想创建新位图,我可以直接在位图上绘制roundRect来转换roundRect形状吗?像这样:

public Bitmap transform(Bitmap bitmap) {
  Canvas canvas = new Canvas(bitmap);
  Paint paint = new Paint();
  paint.setStyle(Paint.Style.FILL_AND_STROKE);
  Path path = new Path();
  path.addRoundRect(0, 0, bitmap.getWidth(), bitmap.getHeight(),50, 50, 
  Path.Direction.CW);
  canvas.clipPath(path);
  return bitmap;
}

不起作用

我有一些问题:

  • 如果使用“PorterDuffXfermode”,是否必须“保存层”和“还原”
  • 我必须创建一个新的位图并在其上绘制吗?我可以绘制可变的src位图吗

  • 只需使用
    BitmapShader
    -您不需要任何
    saveLayer
    /
    restore
    PorterDuffXfermode
    ,如果您不确定如何使用
    BitmapShader
    请参阅
    RoundedBitmapDrawable
    源代码file@pskink非常感谢,我将看到RoundedBitmapDrawable源代码。但我真的想知道为什么它不起作用。我使用drawRoundRect,在中选择Mode.SRC_,然后绘制位图,可以获得roundrect位图,但我更改了顺序,首先绘制位图,在中选择Mode.DST_,然后绘制roundrect,失败了。我认为它们应该是相同的。只需使用
    位图着色器
    -您不需要任何
    保存层
    /
    还原
    PorterDuffXfermode
    ,如果您不确定如何使用
    位图着色器
    请参阅
    RoundedBitmapDrawable
    源代码file@pskink多谢各位,我将看到RoundedBitmapDrawable源代码。但我真的想知道为什么它不起作用。我使用drawRoundRect,在中选择Mode.SRC_,然后绘制位图,可以获得roundrect位图,但我更改了顺序,首先绘制位图,在中选择Mode.DST_,然后绘制roundrect,失败了。我想他们应该是一样的。
    public Bitmap transform(Bitmap bitmap) {
      Canvas canvas = new Canvas(bitmap);
      Paint paint = new Paint();
      paint.setStyle(Paint.Style.FILL_AND_STROKE);
      Path path = new Path();
      path.addRoundRect(0, 0, bitmap.getWidth(), bitmap.getHeight(),50, 50, 
      Path.Direction.CW);
      canvas.clipPath(path);
      return bitmap;
    }