2013-01-01 243 views
13

有由受欢迎的谷歌开发者Romain Guy演示了如何使用圆角绘制了一个nice post(称为his code“StreamDrawable”)上有效的视图。使用圆角绘制

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

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

  2. 如果我有一个输入位图太小,比我想要显示它,输出图像的边缘被抹掉。即使是在Galaxy S3,当你运行示例代码和它的景观,它看起来可怕:

    enter image description here

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

如果我使用setImageDrawable或setBackgroundDrawable无关紧要。它必须是可绘制的东西。

我试着玩变量和bitmapShader,但没有任何工作。可悲的是TileMode没有一个价值,只是拉伸图像,只是以某种方式平铺。

作为解决方法,我可以创建一个新的缩放位图,但这只是一种解决方法。当然有一种更好的方式,它也不会使用比它应该更多的记忆。

如何解决这些问题并使用此优秀代码?

+0

您应该对该文章发表评论或者ping他回答。 –

+0

我觉得他确实:) – DaRolla

+0

你解决了这个问题吗? – tasomaniac

回答

9

我认为在this website上展示的解决方案效果很好。

与其他解决方案不同,它不会导致内存泄漏,即使它基于Romain Guy的解决方案。

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

+0

你能指出它背后的想法吗(或者我能找到它的地方)?我真的没有时间阅读整个项目 – suitianshi

+0

是的,这个想法非常基于Romain Guy在他的网站上发布的内容:http://www.curious-creature.org/2012/12/11/android -recipe-1-image-with-rounded-corners /。 –

4

我有这个代码的大小问题,我解决了它。

也许这会帮助你,太:

在构造函数存储在本地变量中的位图1)(例如私人BMP位图;)

2)覆盖两个方法:

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

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

最好的问候, DaRolla

+1

不,它没有帮助,顺便说一句,如果你只需要一个位图的宽度和高度,你可以存储他们,而不是他们在CTOR。 –

+0

@DaRolla谢谢你指出,为我节省了很多时间。 – CanC

0

有潜在的问题是,BitmapShader的TileMode没有缩放Ø ption。你会注意到在它被设置为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); 
    

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

+0

每种方法的优点和缺点是什么?第三个显然很慢并且使用了更多的记忆,但其他的呢?你推荐哪一个? –

+0

如果你想让位图伸展到视图的大小,那么类似于最后一个的实现几乎是使用“BitmapShader”的唯一方法。第一个将限制视图本身的大小,而第二个将只在视图的左上角绘制着色器。 –

+0

好吧,如果我想让它看起来像一个普通的imageView,只是它会使图像本身具有圆角? –