使用可绘制的圆角
流行的Google开发人员Romain Guy发布了一篇不错的文章,展示了如何高效地在视图上使用可绘制的圆角(在他的代码中称为“StreamDrawable”)。
在纵向模式下,我的Galaxy S3的样品本身工作得很好,但我遇到了一些问题:
如果屏幕很小(例如在qvga屏幕上),则显示的图像会被裁剪。
如果我的输入位图比我想要显示的要小,输出图像的边缘就会被抹掉。 即使在Galaxy S3上,当您运行示例代码并且它处于横向模式时,它看起来也很糟糕:
我仍然不确定(因为我使用缩放图像来使用示例代码的解决方法),但它认为即使这个解决方案在listView中使用时有点慢。 也许有这样的渲染解决方案?
不要紧,如果我使用setImageDrawable或setBackgroundDrawable。 它必须是可绘制的东西。
我试图玩变量和bitmapShader,但没有任何工作。 令人遗憾的是, TileMode不具备拉伸图像的价值,只是以某种方式平铺图像。
作为一种解决方法,我可以创建一个新的缩放位图,但这只是一种解决方法。 当然有一种更好的方式,它也不会使用比它应该更多的记忆。
我如何解决这些问题并使用这个优秀的代码?
我认为在本网站上展示的解决方案效果很好。
与其他解决方案不同,它不会导致内存泄漏,即使它基于Romain Guy的解决方案。
编辑:现在在支持库上,你也可以使用RoundedBitmapDrawable (使用RoundedBitmapDrawableFactory )。
我有这个代码的一些大小问题,我解决了它。
也许这也会对你有所帮助:
1)在构造函数中将位图存储在局部变量中(例如,私人位图bmp;)
2)重写另外两个方法:
@Override
public int getIntrinsicWidth() {
return bmp.getWidth();
}
@Override
public int getIntrinsicHeight() {
return bmp.getHeight();
}
最好的问候,DaRolla
根本的问题是BitmapShader的TileMode
没有缩放选项。 您会在源代码中注意到它已被设置为Shader.TileMode.CLAMP
,并且文档将其描述为:
如果着色器在其原始边界之外绘制,则复制边缘颜色
要解决这个问题,有三种解决方案:
限制绘图区域; 例如,改变:
int width = bounds.width() - mMargin;
int height = bounds.height() - mMargin;
mRect.set(mMargin, mMargin, width, height);
至:
int width = Math.min(mBitmap.getWidth(), bounds.width()) - mMargin;
int height = Math.min(mBitmap.getHeight(), bounds.height()) - mMargin;
mRect.set(mMargin, mMargin, width, height);
将位图缩放到drawable的大小。 我已经将着色器创建到onBoundsChange(),并选择从这里创建一个新的位图:
bitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true);
mBitmapShader = new BitmapShader(bitmap,
Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
请注意,这是一个潜在的缓慢操作,并将在主线程上运行。 您可能需要仔细考虑在实施最后一个解决方案之前如何实施它。