使用圆角绘制(Using a rounded corners drawable)

2019-07-17 17:50发布

有一个不错的职位由受欢迎的谷歌开发者做出罗曼盖伊演示了如何绘制使用圆角(称为“StreamDrawable” 他的代码 )上有效的视图。

样品本身的作品非常好我的Galaxy S3在纵向模式时,但我有几个问题吧:

  1. 如果屏幕是小的(例如在QVGA屏幕),则显示的图像获得裁剪。

  2. 如果我有一个输入位比我多么希望,以显示它太小,输出图像是其边缘模糊。 即使在银河S3,当你运行示例代码和它的景观,它看起来可怕:

  3. 我仍然不知道它(因为我使用缩放使用示例代码图像的解决办法),但它认为,即使这个解决方案是一个有点慢在ListView使用时。 也许有这一个的renderScript解决方案?

如果我使用setImageDrawable或setBackgroundDrawable没关系。 现在一定是在绘制本身。

我试着用变量和bitmapShader玩,但没有奏效。 可悲的是TILEMODE不具有只是伸展的形象,只是平铺它在某些方面的数值。

作为一种变通方法,我可以创造一个新的缩放的位图,但它只是一种变通方法。 当然有也不会占用更多的内存比它应该有更好的方式。

如何解决这些问题,并使用这个伟大的代码?

Answer 1:

我认为这是提出了关于解决本网站效果很好。

不像其他的解决方案,它不会导致内存泄漏,即使它是基于罗曼盖伊的解决方案。

编辑:现在支持库,你也可以使用RoundedBitmapDrawable (使用RoundedBitmapDrawableFactory )。



Answer 2:

我有一些大小的问题与此代码,我解决了这个问题。

也许这会帮助你,太:

1)在构造存储在局部变量的位图(例如位图私人BMP)

2)覆盖两个方法:

@Override
    public int getIntrinsicWidth() {
    return bmp.getWidth();
}

@Override
    public int getIntrinsicHeight() {
    return bmp.getHeight();
}

最好的问候,DaRolla



Answer 3:

有潜在的问题是,BitmapShader的TileMode没有一个缩放选项。 你会注意到在它被设置为源Shader.TileMode.CLAMP和文档描述为:

复制边缘颜色:如果将着色绘制其原有的边界外

要解决这个问题,有三种解决方案:

  1. 限制,其中,抽拉用于将位图的大小的视图的大小。
  2. 约束画区域; 例如改变:

     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); 
  3. 缩放位图的绘制的大小。 我搬到创建着色器到onBoundsChange(),并都选择从这里创建一个新的位图:

     bitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true); mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 

    请注意,这一个潜在的慢操作,将主线程上运行。 您可能要仔细考虑如何让你去为这最后的解决方案之前,来实现它。



文章来源: Using a rounded corners drawable