我在图像视图中显示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适用于我)
所以这第三种方法可行,但它似乎真的很火爆,我希望有更好的方法来解决这个问题。
也许除了抗锯齿之外,我还错过了吗?
有很多东西可能会使用抗锯齿来缩放图像。
一个是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)));
在“METHOD TWO”中,将Drawable
的滤波器设置为false
drawable.setFilterBitmap(false);
而不是使用你提到的setAntialias
方法。