2014-07-13 7 views
1

여러 Android 기기를 지원하는 데 많은 도움을주었습니다. 특정 dpi 폴더의 드로어 블을 만들지 않으면 Android가 자동으로 가장 가까운 것을 가져 와서 크기를 조정한다는 인상하에 있습니다. 나는 XXHDPI를 위해 사용하고있는 스프라이트 시트를 가지고있다. 그것은 내 갤럭시 S4에서 잘 작동하지만, HDPI 화면이있는 Nexus 7을 사용하는 에뮬레이터에서 앱을 실행하면 스프라이트 시트가 완벽하게 조정되지 않은 것 같습니다. 너비가 조금 떨어져서 스프라이트 애니메이션의 전체 프레임을 보지 않고 잘못된 지점에서 잘려서 현재 프레임의 왼쪽 절반과 이전 프레임의 오른쪽 절반을 봅니다. Flash에서 만든 스프라이트 시트이므로 뒤로 이동하고 벡터의 크기를 조정하여 HDPI 폴더의 두 번째 시트를 만드는 것이 쉬웠습니다. 수동으로 이렇게하면 문제가 해결됩니다. 하지만 파일 크기가 커지면 5 장이 필요하지 않습니다. 그렇다면이 문제의 근원은 정확히 무엇입니까? 런타임시 이미지를 스케일하는 더 좋은 방법이 있습니까? 에뮬레이터가 픽셀 완벽하지 않기 때문에 블리 팅이 해제 되었습니까? 아니면 안드로이드 스케일링 방법이 정확하지 않습니까? 5 개 프레임이 있으므로Android Sprite Sheet Scaling

width = bmp.getWidth()/5; 
height = bmp.getHeight(); 

난 (1/5)에 비트 맵의 ​​폭을, 각 프레임의 폭을 설정 객체의 생성자에서

src = new Rect(frame * width, 0, (frame + 1) * width, height); 
dst = new Rect(x, y, x + width, y + height); 
canvas.drawBitmap(bmp, src, dst, null); 

는 난이있다. 나는이 문제를 확인했습니다

편집은 안드로이드 스프라이트 시트를 확장 할 때, 크기는 물론, 정수로 캐스팅 된 것입니다. 예를 들어, XXHDPI에 대한 시트의 폭은 575입니다. 5로 나눌 수 있으므로 XXHDPI에서는 잘 작동하지만, HDPI (XXHDPI의 절반 크기)로 스케일하면 287로 저장됩니다. 5. 첫 번째 프레임은 괜찮습니다. 다음 프레임은 픽셀 옆에 있고, 다음 프레임은 2 등입니다. 이것은 전파되고 나중 프레임이 실제로 나 빠지게 만듭니다.

+0

스프라이트 시트에서 개별 프레임을 가져 오는 위치에 코드를 게시하십시오. –

+0

코드를 추가했습니다. –

답변

0

원본 이미지의 안드로이드 스케일링을 피하려면 assets 폴더에 넣으십시오. 당신이 수도 또는하지 않을 수 있습니다, 당신의 IDE에 따라 : 이는 ID 비록입니다하여 리소스를로드 할 수 없습니다 의미합니다, 그래서 당신은 같은 방법 뭔가를 수동으로 수행해야합니다 :

public static Bitmap getBitmapFromAssets(Context context, String filePath) { 
    AssetManager assetManager = context.getAssets(); 

    InputStream inStream; 
    Bitmap bitmap = null; 
    try { 
     inStream = assetManager.open(filePath); 
     bitmap = BitmapFactory.decodeStream(inStream); 
    } catch (IOException e) { 
     // handle exception 
    } 

    return bitmap; 
} 

주 저작물 폴더가 이미 생성되어 있어야합니다.

원하는 경우 원하는 스프라이트 시트 영역의 비트 맵을 얻은 후에 자체 배율을 조정할 수 있습니다.

int screenSize = context.getResources().getConfiguration().screenLayout; 
    screenSize &= Configuration.SCREENLAYOUT_SIZE_MASK; 

    switch (screenSize) { 
    case Configuration.SCREENLAYOUT_SIZE_SMALL: 
     // scale for small 
     break; 
    case Configuration.SCREENLAYOUT_SIZE_NORMAL: 
     // scale for normal 
     break; 
    case Configuration.SCREENLAYOUT_SIZE_LARGE: 
     // scale for large 
     break; 
    case 4: Configuration.SCREENLAYOUT_SIZE_XLARGE // If your min sdk is >= 9 
     // scale for xlarge 
     break;