【问题标题】:Scale picasso bitmap to fill height in CircleImageView缩放毕加索位图以填充 CircleImageView 中的高度
【发布时间】:2016-08-31 16:41:14
【问题描述】:

我正在使用https://github.com/hdodenhof/CircleImageView 库,但也尝试了其他几个库,但都没有帮助。我需要使用毕加索从服务器加载图像,例如mPicasso.load(url).into(mCircularImageView)。但是我总是得到这个:

但我需要做到这一点:

尝试调用resize(100,100)fit()transform(new CircleTransorm())

public class CircleTransform implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap,
            BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        squaredBitmap.recycle();
        return bitmap;
    }

    @Override
    public String key() {
        return "circle";
    }
}

以上都没有帮助。

我的布局:

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/account_profile_picture"
        style="@style/ProfilePicture"
        android:layout_gravity="center_horizontal"/>

风格:

<style name="ProfilePicture">
    <item name="android:layout_width">@dimen/profile_picture_size</item>
    <item name="android:layout_height">@dimen/profile_picture_size</item>
    <item name="android:src">@drawable/profile_picture_placeholder</item>
    <item name="civ_border_width">1dp</item>
    <item name="civ_border_color">#FF000000</item>
</style>

【问题讨论】:

    标签: android imageview picasso


    【解决方案1】:

    White fit() 将调用推迟到视图被加载和测量,它没有达到你想要的结果。您需要添加centerCrop() 才能达到预期的输出:

    mPicasso.load(url).fit().centerCrop().into(mCircularImageView)
    

    【讨论】:

    • 然后确保您的布局设置正确。你能用你的布局 xml 更新你原来的问题吗?
    【解决方案2】:

    只需将此属性设置为您的circleimageview

    android:scaleType="centerCrop"
    

    应该这样做。

    谢谢

    【讨论】:

      【解决方案3】:

      请使用这个你可以创建动态图像视图,我希望这对你有帮助。

      public class RoundedImageView extends ImageView {
      
          public RoundedImageView(Context context) {
              super(context);
          }
      
          public RoundedImageView(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          public RoundedImageView(Context context, AttributeSet attrs, int defStyle) {
              super(context, attrs, defStyle);
          }
      
          @Override
          protected void onDraw(Canvas canvas) {
      
              Drawable drawable = getDrawable();
      
              if (drawable == null) {
                  return;
              }
      
              if (getWidth() == 0 || getHeight() == 0) {
                  return;
              }
              Bitmap b = ((BitmapDrawable) drawable).getBitmap();
              Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
      
              int w = getWidth(), h = getHeight();
      
              Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
              canvas.drawBitmap(roundBitmap, 0, 0, null);
      
          }
      
          public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
              Bitmap sbmp;
      
              if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
                  float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
                  float factor = smallest / radius;
                  sbmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth() / factor), (int)(bmp.getHeight() / factor), false);
              } else {
                  sbmp = bmp;
              }
      
              Bitmap output = Bitmap.createBitmap(radius, radius, Bitmap.Config.ARGB_8888);
              Canvas canvas = new Canvas(output);
      
              final int color = 0xffa19774;
              final Paint paint = new Paint();
              final Rect rect = new Rect(0, 0, radius, radius);
      
              paint.setAntiAlias(true);
              paint.setFilterBitmap(true);
              paint.setDither(true);
              canvas.drawARGB(0, 0, 0, 0);
              paint.setColor(Color.parseColor("#BAB399"));
              canvas.drawCircle(radius / 2 + 0.7f,
                      radius / 2 + 0.7f, radius / 2 + 0.1f, paint);
              paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
              canvas.drawBitmap(sbmp, rect, rect, paint);
      
              return output;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        您不需要为圆形图像视图添加任何库。 Android api已经提供了

        RoundedBitmapDrawable

        用于此目的。我已经使用 Glide 库来做你想做的事 -

        Glide.with(context)
                            .load(imageUrl)
                            .asBitmap()
                            .placeholder(R.color.gray)
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .centerCrop()
                            .into(new BitmapImageViewTarget(imageView){
                                @Override
                                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                    RoundedBitmapDrawable circularBitmapDrawable =
                                            RoundedBitmapDrawableFactory.create(context.getResources(), resource);
                                    circularBitmapDrawable.setCircular(true);
                                    imageView.setImageDrawable(circularBitmapDrawable);
                                }
        
                                @Override
                                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                                    imageView.setImageResource(R.drawable.profile);
                                }
                            });
        

        【讨论】:

          【解决方案5】:

          我在您的代码中看到的是您同时使用圆形变换和圆形图像视图。对于制作圆圈,您只能使用一种方法,我建议您使用圆形转换也将您的圆形图像视图更改为简单的图像视图。

          mPicasso.load(url).resize(300,300).centerCrop().transform (new CircleTransform ()).into(mImageView);
          

          希望它会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-01
            • 2021-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-18
            相关资源
            最近更新 更多