2017-09-03 1 views
3

imageviews에 96x96 픽셀 아트 스프라이트를 표시하고 앤티 앨리어싱을 적용하지 않고 표시 할 수 없습니다 (앤티 앨리어싱이 아닌 경우 적어도 보간법이 적용되지 않음).), 이는 스프라이트의 날카로운 모서리를 파괴합니다.Android Imageview에서 앤티 앨리어싱 사용 안 함

어떻게이 작업을 수행 할 수 있습니까? 나는 인터넷에서 수집 한 다음 방법을 시도했지만 아무 것도 작동하지 않는다.

방법 ONE

비트 맵있는 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); 

방법 세

그래서이 세 번째 방법은 작업 (512 × 512은 나를 위해 일한),하지만 보인다 정말 햄 - 주먹, 나는 이것에 대해 갈 좋은 방법이 있었으면 좋겠다.

내가 여기 놓친 안티 앨리어싱 이외의 다른 것이있을 수 있습니까?

답변

3

앤티 앨리어싱을 사용하여 이미지의 크기를 조정할 수있는 요소가 여러 개 있습니다.

하나는 BitmapFactory입니다. 예를 들어 drawable-mdpi 리소스가 있고 현재 리소스 구성이 xhdpi 인 경우 디코딩 시간에 확장됩니다. 이를 피할 수있는 옵션을 제공 할 수 있지만 가장 쉬운 방법은이 리소스를 drawable-nodpi에 넣는 것입니다.

캔버스는 기본적으로 쌍 선형 샘플링으로 이미지의 크기를 조정합니다. 이를 방지하려면 Canvas으로 그릴 때 Paint.setFilterBitmap(false)과 함께 사용하십시오. 이를 수행하는 한 가지 방법은 원하는 페인트 플래그를 수정하는 DrawFilter으로 기본 .draw() 호출을 래핑하는 사용자 정의 Drawable을 사용하는 것입니다.

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

관련 문제