2017-09-03 23 views
3

imageviewsに96x96ピクセルのアートスプライトを表示していますが、アンチエイリアスを適用しないと表示できません(アンチエイリアスでない場合は、 )、これはスプライトの鋭いエッジを破壊する。Android Imageviewでアンチエイリアスを無効にする

どうすればいいですか?私はインターネットの周りから集めた以下のメソッドを試しましたが、何もできません。

METHOD ONE

ビットマップを使用してXMLリソースファイルを作成し、falseにアンチエイリアスフラグを設定します。すべて

METHOD TWO

リソースからビットマップオブジェクトを作成し、falseにアンチエイリアスフラグを設定することで動作しませんでした。全く動かなかった。

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

までしか、彼らはスケールダウンする必要は決してありませんように十分な大きさのスプライトを用いた方法THREE (512×512が私のために働いていた)

したがって、この第三の方法は動作しますが、それはそうです本当にハム拳で、私はこれについてもっと良い方法があることを期待していました。

おそらく、私が逃したアンチエイリアス以外に何かがありますか?

答えて

3

アンチエイリアスを使用してイメージを拡大縮小する可能性があるものは複数あります。

1つはBitmapFactoryです。たとえば、drawable-mdpiリソースがあり、現在のリソース構成がxhdpiの場合、デコード時に拡張されます。これを避けるためのオプションを提供できますが、最も簡単な方法はこれらのリソースをdrawable-nodpiに入れることです。

キャンバスでは、デフォルトで双線形サンプリングで画像が拡大縮小されます。それを避けるには、Canvasに描画するときはPaint.setFilterBitmap(false)と使用します。これを行う1つの方法は、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))); 
+0

は、ああ、はい、描画可能nodpiで画像を置くことは魅力のように働いた、本当にありがとうございました! – Dportology

+0

詳細を見ると、画像は実際にはまだぼやけています。どのバージョンのDrawableWrapperクラスが使用されていますか?いずれもonDrawメソッドを持っていないようです。 – Dportology

+0

android.graphics.drawable.DrawableWrapper'。私は 'onDraw()'ではなく 'draw()'と書いていました。 – ephemient

関連する問題