我最近从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);
}
因此,当通过drawable或bitmap设置图像时,此位有效。我也扩展了它,所以我可以使用谷歌的Volley NetworkImageView,它也可以使用。
当我尝试将我的CircularImageView类与Picasso图像下载库一起使用时,我的问题出现了,因为我将它视为Volley的替代品。在获取BitmapDrawable时,在第一行的loadBitmap()函数中发生了ClassCastException。
private void loadBitmap()
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();
if(bitmapDrawable != null)
image = bitmapDrawable.getBitmap();
}
最初在Picasso下载图片之前,它将占位符图像四舍五入。但是一旦Picasso下载了图像,它就会因为getDrawable()返回和PicassoDrawable而不是BitmapDrawable而失败并出现ClassCastException。
我想继续工作,在我的CircularImageView类中的onDraw(canvas)方法中舍入图像,因为它很好地包含和自动,而不是每次都使用Picasso设置ImageView时的过程。这可能吗?
提前致谢。
答案 0 :(得分:14)
对于使用Picasso的圆形图像,请使用实现Transformation的this类。
Picasso.with(context).load(url).transform(new RoundedTransformation(radius, margin)).into(imageview);
答案 1 :(得分:5)
与毕加索合作时,您应该:
Transformation
,以便将舍入的位图缓存在内存中,或ImageView
子类中使用着色器夹住画布。 ragin'cagin'Romain Guy on his blog 尝试从Bitmap
中提取基础ImageView
是一种反模式。如果您确实需要访问Bitmap
(您不应该使用上述其中一项),请在Target
回调将提供该视图的视图上实施onBitmapSuccess
。