在 Android Imageview 上禁用抗锯齿

Dpo*_*ogy 6 android imageview

我在图像视图中显示 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);
Run Code Online (Sandbox Code Playgroud)

方法三 使用足够大的精灵,它们永远不需要缩小,只需要放大(512x512对我有用)

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

也许这里除了抗锯齿之外还有其他东西我错过了?

eph*_*ent 7

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

一个是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);
    }
}
Run Code Online (Sandbox Code Playgroud)
imageView.setDrawable(new AliasingDrawableWrapper(getDrawable(R.drawable.bitmap)));
Run Code Online (Sandbox Code Playgroud)