Android 安卓圆形图像与毕加索

Android 安卓圆形图像与毕加索,android,android-layout,picasso,Android,Android Layout,Picasso,我想用5px在imageview上展示毕加索的作品。我创建了一个名为imagerroundcorners的简单类,在这个类中,我使用简单的方法对图像的角点进行圆角,但我的代码不起作用,角点不圆角。下面是我的代码: file = new File(APP.DIR_APP + APP.IMAGE + "/ok.jpg"); if (file.isFile() && file.exists()) { Uri uri = Uri.fromFile(file);

我想用5px在imageview上展示毕加索的作品。我创建了一个名为
imagerroundcorners
的简单类,在这个类中,我使用简单的方法对图像的角点进行圆角,但我的代码不起作用,角点不圆角。下面是我的代码:

   file = new File(APP.DIR_APP + APP.IMAGE + "/ok.jpg");
   if (file.isFile() && file.exists()) {
       Uri uri = Uri.fromFile(file);
       Picasso.with(this).load(uri).transform(new ImageRoundCorners()).into(fiv_image_view);
   }
ImageRoundCorners
class:

import com.squareup.picasso.Transformation;

public class ImageRoundCorners implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap output = Bitmap.createBitmap(source.getWidth(), source
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int   color   = 0xff424242;
        final Paint paint   = new Paint();
        final Rect  rect    = new Rect(0, 0, source.getWidth(), source.getHeight());
        final RectF rectF   = new RectF(rect);
        final float roundPx = 50;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(source, rect, rect, paint);

        return output;
    }

    @Override
    public String key() {
        return "RoundImage";
    }
}
此代码中的问题是什么?如何解决

我得到这个错误:

java.lang.IllegalStateException: Transformation RoundImage mutated input Bitmap but failed to recycle the original.

可以将此图像视图用于圆角


结果


步骤1
在Build.Gradle(模块:App)中编译'de.hdodenhof:circleimageview:1.2.1'

XML文件中的步骤2

<de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/imageView"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_centerVertical="true"
            android:src="@drawable/chetankambale" />
// get image from drawble with rounded corner converted image
     Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.yogeshborhade);
            Bitmap circularBitmap = ImageConverter.getRoundedCornerBitmap(bitmap, 100);

// set rounded corner image to imageview
     ImageView circularImageView = (ImageView) layout.findViewById(R.id.imageView);
            circularImageView.setImageBitmap(circularBitmap);

您可以使用毕加索的RoundedCornertans格式,如下所示:

final int radius = 5;
final int margin = 5;
final Transformation transformation = new RoundedCornersTransformation(radius,margin);
Picasso.with(activity).load(uri).transform(transformation).into(fiv_image_view);

您可以使用以下库来实现它。



错误信息非常清楚。您只是忘记了回收原始位图

....
canvas.drawBitmap(source, rect, rect, paint);
source.recycle();
return output;

代码中只缺少一行!(我对所有这些答案都很惊讶,它们告诉你要做各种不相关的、彻底根除的解决方案。)

你为什么不尝试自定义
可绘制的
,并应用到你的imageView上呢。@W4R10CK我想用这些代码我有了一个简单的实现,我必须说,不要裁剪原始图像,取而代之的是使用自定义的可绘制到您的imageview以使角变圆。如果返回新位图,则需要对原始位图调用recycle()。看看毕加索图书馆的创建者在这个问题上说了些什么,我发现最干净的方式是:在花了几个小时之后,这个链接帮助我找到了确切的需求。谢谢:)
<com.mikhaellopez.circularimageview.CircularImageView
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:src="@drawable/image"
    app:civ_border_color="#EEEEEE"
    app:civ_border_width="4dp"
    app:civ_shadow="true"
    app:civ_shadow_radius="10"
    app:civ_shadow_color="#8BC34A"/>
Picasso.with(MainActivity.this)
    .load(url)
    .transform(new PRoundedCornersTransformation(30, 0, PRoundedCornerTransformation.CornerType.ALL))
    .into(imageView);
....
canvas.drawBitmap(source, rect, rect, paint);
source.recycle();
return output;