使用可绘制的圆角

流行的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);
    

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

  • 链接地址: http://www.djcxy.com/p/31409.html

    上一篇: Using a rounded corners drawable

    下一篇: bitmap circular crop in android