在Android Imageview上禁用抗锯齿功能

时间:2017-09-03 23:51:04

标签: android imageview

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

如何做到这一点?我尝试过以下从互联网上获取的方法,但都没有用。

方法一

使用位图创建xml资源文件,并将anti -ias标志设置为false。完全不起作用

方法二

从资源创建位图对象,并将anti -ias标志设置为false。根本没用。

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

方法三 使用足够大的精灵,以便它们永远不需要按比例缩小,只有(512x512适用于我)

所以这第三种方法可行,但它看起来真的很火,而且我希望有更好的方法来解决这个问题。

也许除了抗锯齿之外还有一些我错过的东西?

2 个答案:

答案 0 :(得分:3)

有很多事情可能会使用抗锯齿来缩放图像。

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

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

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)));

答案 1 :(得分:0)

“方法二” 中,使用

Drawable的过滤器设置为false
drawable.setFilterBitmap(false);

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