【问题标题】:Disable anti-aliasing on Android Imageview在 Android Imageview 上禁用抗锯齿
【发布时间】:2019-04-19 22:12:38
【问题描述】:

我在图像视图中显示 96x96 像素艺术精灵,如果不应用抗锯齿(或至少某种形式的插值,如果它不是抗锯齿)就无法显示它,这会破坏锐利的边缘的精灵。

如何做到这一点?我尝试了以下从互联网上收集的方法,但都没有奏效。

方法一

使用位图创建 xml 资源文件,并将抗锯齿标志设置为 false。完全没用

方法二

从资源创建位图对象,并将抗锯齿标志设置为 false。根本没用。

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dryad_back_large);
    BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
    drawable.setAntiAlias(false);
    playerMonsterImageView.setImageDrawable(drawable);

方法三 使用足够大的精灵,这样它们就不需要按比例缩小,只需放大(512x512 对我有用)

所以这第三种方法可行,但它似乎真的很笨拙,我希望有更好的方法来解决这个问题。

也许我错过了除抗锯齿之外的其他东西?

【问题讨论】:

    标签: android imageview


    【解决方案1】:

    有多种因素可能会使用抗锯齿缩放您的图像。

    一个是BitmapFactory。例如,如果您有一个drawable-mdpi 资源并且当前资源配置是xhdpi,它将在解码时进行缩放。您可以提供一些选项来避免这种情况,但最简单的解决方法是将这些资源放在drawable-nodpi 中。

    默认情况下,画布还使用双线性采样缩放图像。为避免这种情况,请在绘制到Canvas 时使用Paint 和.setFilterBitmap(false)。一种方法是使用自定义 Drawable,它使用 DrawFilter 修改所需的绘制标志来包装底层 .draw() 调用。

    public class AliasingDrawableWrapper extends DrawableWrapper {
        private static final DrawFilter DRAW_FILTER =
            new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0);
    
        public AliasingDrawableWrapper(Drawable wrapped) {
            super(wrapped);
        }
    
        @Override
        public void draw(Canvas canvas) {
            DrawFilter oldDrawFilter = canvas.getDrawFilter();
            canvas.setDrawFilter(DRAW_FILTER);
            super.draw(canvas);
            canvas.setDrawFilter(oldDrawFilter);
        }
    }
    
    imageView.setDrawable(new AliasingDrawableWrapper(getDrawable(R.drawable.bitmap)));
    

    【讨论】:

    • 啊,是的,将图像放入 drawable-nodpi 非常有用,非常感谢!
    • 仔细观察,图像实际上仍然模糊。正在使用哪个版本的 DrawableWrapper 类?他们似乎都没有 onDraw 方法。
    • android.graphics.drawable.DrawableWrapper。我的意思是写draw()而不是onDraw(),修复。
    • 谢谢,效果很好。像这样的任何机会都可以在 API 23 以下的任何东西上工作吗?使用旧版本的库还是什么?
    • @Dportology Copy DrawableWrapper,因为支持库版本不是公共 API 的一部分(很遗憾)。但这很简单。
    【解决方案2】:

    在“方法二”中,将Drawable的过滤器设置为false

    drawable.setFilterBitmap(false);
    

    而不是使用您提到的setAntialias 方法。

    【讨论】:

    • 经过大量搜索后,终于可以使用这个非常感谢老兄了;)我设置了drawable.setAntiAlias(false);,但没有效果,设置drawable.setFilterBitmap(false); 后它可以工作了。
    猜你喜欢
    • 2023-04-06
    • 2013-06-30
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2013-03-03
    相关资源
    最近更新 更多