2012-09-02 4 views
3

상황입니다. 세 가지 레이아웃으로 된 ViewAnimator가 있습니다. 각 레이아웃에는 서로 다른 배경 이미지가 있습니다. xhdpi 장치의 경우 이미지 크기는 1280x800 픽셀이며 크기는 ~ 150KB입니다. 이제 문제 :Android ViewAnimator 및 OutOfMemoryError

09-02 08:22:46.408: D/dalvikvm(1291): GC_EXTERNAL_ALLOC freed 428K, 51% free 2874K/5831K, external 18484K/20407K, paused 83ms 
09-02 08:22:46.419: E/dalvikvm-heap(1291): 1366400-byte external allocation too large for this process. 
09-02 08:22:46.498: I/dalvikvm-heap(1291): Clamp target GC heap from 25.089MB to 24.000MB 
09-02 08:22:46.498: E/GraphicsJNI(1291): VM won't let us allocate 1366400 bytes 
09-02 08:22:49.208: E/AndroidRuntime(1291): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

아무도 내 문제에 대한 해결책이나 해결 방법을 가지고 : 나는 화면 1280x800의 크기와 320dp의 밀도와 에뮬레이터를 시작할 때, 나는 항상이 예외가 발생? BitmapFactory에 대해 읽어 보았습니다. 도움이 되나요? 최고 감사합니다! 편집

: 레이아웃 파일 main_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:orientation="vertical" > 

<ViewAnimator 
    android:id="@+id/viewAnimator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:id="@+id/LayoutMain" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:background="@drawable/background" 
     ...some Buttons etc. ... 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/layoutGameMenu" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:background="@drawable/gameMenu" 
     ...some Buttons etc. ... 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/layoutHighscores" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:background="@drawable/highscores" 
     ...some ListViews etc. ... 
    </LinearLayout> 

</ViewAnimator> 
</LinearLayout> 

그리고 MainActivity : 여기 내 코드 나는 MAINMENU 사이를 전환 할 수 있습니다,이와

private ViewAnimator va; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 
    va = (ViewAnimator) findViewById(R.id.viewAnimator); 
    .... 
} 

.... 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
     if (va.getCurrentView() == findViewById(R.id.layoutHighscores)) { 
      va.setInAnimation(inFromRight); 
      va.setOutAnimation(outToLeft); 
      va.setDisplayedChild(0); 
      return true; 
     } 
     if (va.getCurrentView() == findViewById(R.id.layoutGameMenu)) { 
      va.setInAnimation(inFromLeft); 
      va.setOutAnimation(outToRight); 
      va.setDisplayedChild(0); 
      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

, 최고 기록 gamemode를 시작하는 버튼이있는 gamemenu가 있습니다. "시원한"뷰 애니메이션을 원하기 때문에 이것을 선택합니다.

BitmapFactory 메서드로 해결하려고 시도했지만 변경된 사항이 없습니다.

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
// Raw height and width of image 
final int height = options.outHeight; 
final int width = options.outWidth; 
int inSampleSize = 1; 

if (height > reqHeight || width > reqWidth) { 
    if (width > height) { 
     inSampleSize = Math.round((float)height/(float)reqHeight); 
    } else { 
     inSampleSize = Math.round((float)width/(float)reqWidth); 
    } 
} 
return inSampleSize; 
} 
+0

실제 기기를 사용해 보셨나요? – wtsang02

+0

아니요,이 크기의 장치가 없습니다. 그래서 에뮬레이터에서 시험해보아야합니다. – Namenlos

답변

0

는 기본 안드로이드 사이트의 안드로이드 교육 섹션에서이 상황을 커버하는 교훈이있다. Displaying Bitmaps Efficiently은 4 개의 섹션으로 나누어 져 있으며 작동 예제가 포함되어 있으며 API 레벨 7 이상을 지원합니다 (문제가 아닌 것으로 가정).

그게 도움이되지 않는다면 몇 가지 코드를 게시하는 것이 좋습니다. 그래서 더 구체적인 도움을 줄 수 있습니다. ;-)

+0

안녕하세요, [이 링크] (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html)에 표시된대로 BitmapFactory.decode * 메소드로 시도했지만 효과가 없습니다. 나는 여전히 예외를 받는다. 원한다면 몇 가지 코드를 게시 할 수는 있지만 레이아웃에서 backgroundimages를 설정하는 데 도움이된다고 생각하지 않습니다. android : background = "@ drawable/background". 최고의 레그 라드. – Namenlos

+0

@ Namenlos, 그것은 IMH 코드를 추가할만한 가치가 _ 항상 _ 있습니다. 그렇지 않으면 더 많은 눈을 얻습니다. 만약 당신이 당신의 코드를 너무 많이 보여줄지 걱정된다면 (공통적 인 문제로 보임), 나는 모범을 보일 것을 제안한다. 그냥 똑같은 오류가 있는지 확인하기 위해 그것을 테스트하십시오 ;-) – Chilledrat

+1

맞습니다. 몇 가지 코드를 추가했습니다. 보시다시피, 저는 BitmapFactory로 시도했습니다. 그러나 아무런 효과가 없었다. 그러나 하나 이상의 그림을로드 할 수 있어야합니다. 그건 미친 짓이야. < – Namenlos