android - 在 Android Imageview 上禁用抗锯齿

标签 android imageview

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

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

方法一

创建带有位图的 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);

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

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

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

最佳答案

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

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

默认情况下, Canvas 还使用双线性采样缩放图像。为避免这种情况,在绘制到 Canvas 时,使用带有 .setFilterBitmap(false)Paint。一种方法是使用自定义 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)));

关于android - 在 Android Imageview 上禁用抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46028774/

相关文章:

android - 应用内购买或外部支付处理器?

android - LinearLayout 中的RelativeLayout 无法正确包装内容

android - 我尝试从 YUV 图像创建位图,但图像看起来失真(有绿色和粉红色叠加层)

java - 如何在不改变ImageView宽度的情况下设置图像的宽度(在ImageView中)?

image - 如何在 JAVAFX 中加载计算机目录图像

android - 海拔不适用于 LinearLayout

android - 使用 HttpPost 通过 Android 在 Facebook 中发布视频

android - 如何找出apk文件中使用的Jar?

Android:xml 图像缩放不足以增加图像大小

android - Python 失去 Mysql 服务器连接