7

我最近从 ImageView 扩展创建一个 CircularImageView 类,它使图像带有彩色边框的圆形。这是通过 onDraw(canvas) 方法通过在传入的画布上绘制来完成的:

//load the bitmap
    loadBitmap();

    // init shader
    if(image !=null)
    {   
        shader = new BitmapShader(Bitmap.createScaledBitmap(image, viewWidth + (borderWidth * 2), viewHeight + (borderWidth * 2), true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);

        int circleCenter = viewWidth / 2;

        // circleCenter is the x or y of the view's center
        // radius is the radius in pixels of the cirle to be drawn
        // paint contains the shader that will texture the shape
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth, paintBorder);
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paintBackground);
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paint);
    }   

因此,当通过可绘制或位图设置图像时,此位有效。我还扩展了它,因此我可以将它与谷歌的 Volley NetworkImageView 一起使用,它也可以工作。

当我尝试将我的 CircularImageView 类与 Picasso 图像下载库一起使用时,我的问题就出现了,因为我将它视为 Volley 的替代品。在获取 BitmapDrawable 时,第一行的 loadBitmap() 函数中发生了 ClassCastException。

private void loadBitmap()
{
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();

    if(bitmapDrawable != null)
        image = bitmapDrawable.getBitmap();
}

最初在毕加索下载图片之前,它会很好地环绕占位符图像。但是,一旦 Picasso 下载了图像,它就会失败并返回 ClassCastException,因为 getDrawable() 返回并且 PicassoDrawable 而不是 BitmapDrawable。

我想在我的 CircularImageView 类的 onDraw(canvas) 方法中保留对图像进行四舍五入的工作,因为它很好地包含并且是自动的,而不是每次都使用 Picasso 设置 ImageView 时执行该过程。这可能吗?

提前致谢。

4

2 回答 2

14

对于使用毕加索的圆形图像,请使用实现转换的此类。

Picasso.with(context).load(url).transform(new RoundedTransformation(radius, margin)).into(imageview);
于 2013-11-20T17:01:50.133 回答
5

使用毕加索执行此操作时,您应该:

  1. 将舍入作为 a 应用,Transformation以便将舍入位图缓存在内存中,或者
  2. 在自定义子类中使用着色器夹住画布ImageViewragin' cagin' Romain Guy在他的博客上概述了这种技术的详细信息

试图将底层Bitmap从 an中拉出来ImageView是一种反模式。如果您确实需要访问 a Bitmap(而您不需要,您应该使用上述之一),Target请在您的视图上实现其onBitmapSuccess回调将提供它。

于 2013-10-23T01:15:39.653 回答