使用圆角可绘制

时间:2013-01-01 09:05:51

标签: android rounded-corners android-drawable

广受欢迎的Google开发人员nice post制作了Romain Guy,其中展示了如何有效地在视图上使用圆角可绘制(在his code中称为“StreamDrawable”)。 p>

在纵向模式下,样本本身在我的Galaxy S3上运行得非常好,但我有一些问题:

  1. 如果屏幕较小(例如在qvga屏幕上),则显示的图像会被裁剪。

  2. 如果我的输入位图比我想要显示的位图小,输出图像的边缘会被涂抹。即使在Galaxy S3上,当您运行示例代码并且它在横向上时,它看起来很糟糕:

    enter image description here

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

  4. 如果我使用setImageDrawable或setBackgroundDrawable并不重要。它必须是drawable本身的东西。

    我尝试过使用变量和bitmapShader,但没有任何效果。可悲的是TileMode没有拉伸图像的价值,只是以某种方式对其进行平铺。

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

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

3 个答案:

答案 0 :(得分:9)

我认为this website上提供的解决方案效果很好。

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

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

答案 1 :(得分:4)

我对这段代码有一些尺寸问题,我解决了它。

也许这对你有帮助:

1)在构造函数中将位图存储在局部变量中(例如私有Bitmap bmp;)

2)覆盖另外两种方法:

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

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

祝你好运, DaRolla

答案 2 :(得分:0)

底层问题是BitmapShader的TileMode没有缩放选项。您会在来源中注意到它已被设置为Shader.TileMode.CLAMP,并且文档将其描述为:

  如果着色器在其原始边界之外绘制,则

复制边缘颜色

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

  1. 将使用drawable的视图的大小限制为位图的大小。
  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. 将位图缩放到drawable的大小。我已经将着色器创建到onBoundsChange()并选择从这里创建一个新的位图:

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

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