I'm showing 96x96 pixel art sprites in imageviews and can't get it to display without applying anti-aliasing (or at least some form of interpolation, if it isn't anti-aliasing), which ruins the sharp edge of the sprites.
How can this be done? I've tried the following methods I've picked up from around the internet, but none work.
METHOD ONE
creating an xml resource file with a bitmap, and setting the anti-alias flag to false. Didn't work at all
METHOD TWO
creating a bitmap object from the resource, and setting the anti-alias flag to false. Didn't work at all.
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dryad_back_large);
BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap);
drawable.setAntiAlias(false);
playerMonsterImageView.setImageDrawable(drawable);
METHOD THREE Using sprites which are large enough so that they will never need to be scaled down, only up (512x512 worked for me)
So this third method WORKS, but it seems really ham-fisted, and I was hoping there was a better way of going about this.
Maybe there's something other than anti-aliasing going on here that I've missed?
There are multiple things that may be scaling your image with anti-aliasing.
One is BitmapFactory. For example, if you have a drawable-mdpi resource and the current resource configuration is xhdpi, it will scale at decode time. You can provide options to avoid this, but the easiest way around it is to put these resources in drawable-nodpi.
The canvas also scales the image with bilinear sampling by default. To avoid that, use a Paint with .setFilterBitmap(false) when drawing to the Canvas. One way to do that is by using a custom Drawable which wraps the underlying .draw() call with a DrawFilter modifying the desired paint flags.
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)));
In "METHOD TWO", set the filter of the Drawable to false with
drawable.setFilterBitmap(false);
instead of using the setAntialias method you mention.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With