【问题标题】:Android round image with picasso带有毕加索的Android圆形图像
【发布时间】:2017-05-17 03:51:43
【问题描述】:

我想用 5px 圆角图像以显示在毕加索的图像视图上。我创建了简单的类ImageRoundCorners,在其中我使用简单的方法来圆角图像,但我的代码不起作用,角落没有圆角。下面是我的代码:

   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 类:

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.

【问题讨论】:

  • 你为什么不尝试自定义 Drawable 并应用到你的 imageView。
  • @W4R10CK 我认为使用这段代码我有简单的实现
  • 我必须说不要裁剪原始图像,而是使用自定义 Drawable 到您的 imageview 来使角落变圆。
  • 如果您返回一个新的位图,那么您需要在原始位图上调用 recycle()。检查毕加索图书馆的创建者对此问题的看法,github.com/square/picasso/issues/489
  • 我找到的最干净的方式是这样的:medium.com/@ookami.kb/…

标签: android android-layout picasso


【解决方案1】:

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

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

您的代码中仅缺少一行! (我很惊讶所有这些答案告诉你做各种不相关的、连根拔起的解决方案。)

【讨论】:

    【解决方案2】:

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

    https://github.com/siyamed/android-shape-imageview

    <com.github.siyamed.shapeimageview.RoundedImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/neo"
        app:siRadius="6dp"
        app:siBorderWidth="6dp"
        app:siBorderColor="@color/darkgray"
        app:siSquare="true"/>
    

    结果

    【讨论】:

    • 花了几个小时后,这个链接帮助我找到了确切的要求。谢谢:)
    【解决方案3】:

    您可以像这样使用毕加索的 RoundedCornerTansformation ::

    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);
    

    【讨论】:

      【解决方案4】:

      第 1 步 compile 'de.hdodenhof:circleimageview:1.2.1' 在您的 Build.Gradle(Module:App) 中

      在 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" />
      

      活动中的第 3 步

      // 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);
      

      【讨论】:

        【解决方案5】:

        您可以使用以下库。 https://github.com/lopspower/CircularImageView

        <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"/>
        

        【讨论】:

          【解决方案6】:
          Picasso.with(MainActivity.this)
              .load(url)
              .transform(new PRoundedCornersTransformation(30, 0, PRoundedCornerTransformation.CornerType.ALL))
              .into(imageView);
          

          【讨论】:

            猜你喜欢
            • 2014-11-24
            • 1970-01-01
            • 2021-05-06
            • 2019-05-13
            • 2018-03-02
            • 1970-01-01
            • 2017-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多