2014-10-21 2 views
0

버튼을 눌러 설정할 수있는 여러 개의 배경 화면을 보여주는 응용 프로그램을 만들려고합니다. Threrfore 10 개의 다른 조각으로 ViewPager를 만들었습니다. 각 조각은 전체 화면으로 배경 화면의 섹션을 표시해야합니다. 문제는 월페이퍼가 OutOfMemoryException을 초래하는 고화질 (3000 * 2500)이라는 것입니다. 이것이 내가이 고해상도가 아닌 화면 크기의 비트 맵으로 가득 찬 ArrayList를 처음 생성하려고했던 이유입니다. 그래도 OutOfMemoryException이 발생합니다. 다음은이 코드를 작성하는 방법입니다.비트 맵 축소판 ArrayList 만들기

public ArrayList<Bitmap> createThumbnails() { 
    ArrayList<Bitmap> result = new ArrayList<Bitmap>(); 
    for(int i = 0; i < NUM_PAGES; i++) { 

     //Bitmaps will be loaded here by resource, they're called w_0, w_1, w_2... 

     Bitmap b0 = BitmapFactory.decodeResource(getResources(), getResources().getIdentifier("w_" + i, "drawable", getPackageName())); 

     //Here the thumbnail gets created with new Dimensions (screenWidth and screenHeight) 

     Bitmap b1 = Bitmap.createBitmap(b0, 0, 0, screenWidth, screenHeight); 

     //The full-sized Bitmap gets recycled to gain some memory back 

     b0.recycle(); 

     //The resized Bitmap 'b1' gets added to the ArrayList and the loop repeats 

     result.add(b1); 
    } 
    return result; 
} 

더 나은 방법이 있습니까? 서로 다른 비율의 배경 화면이 있습니다. 난이 벽지에서 잘라낸 화면의 크기를 전체 화면으로 보여 주기만하면됩니다. 이것을 어떻게 할 수 있습니까?

미리 감사드립니다.

+0

이 방법은 메모리를 소비합니다. 보십시오 : http://stackoverflow.com/a/18015841/1531054 –

답변

0

표시하기 전에 비트 맵의 ​​크기를 조정 해보십시오. 즉 당신이 원하는 아니라면

, 그런 다음, 매니페스트 파일에서 안드로이드를이

을 설정하십시오

= "true"로이 여전히 당신을 만족하지 않는 경우 LargeHeap, 당신은 좋겠 비트 맵을 java ----> 외부에 보유해야합니다. https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations

+0

그건 내 생각이야. 나는 먼저 게시 한이 코드 스 니펫으로 ArrayList를 만들고이 실제 이미지의 "축소판 그림"을 그려 봅니다. – user2410644

+0

비트 맵의 ​​arraylist 메모리에 매우 무겁습니다. 어쩌면 비트 맵 url 또는 파일 경로의 arraylist를 시도해야합니다. –

+0

모든 비트 맵은 ViewPager에 표시되므로 모두 simultanuously 표시됩니다. ArrayList를 통해 그려 지거나 (simultanuously) URL로로드되는 경우 차이가 있습니까? – user2410644

1

축소판 그림에서로드하려는 이미지에는 일반적으로 약 7MB가 필요하며 메모리가 부족할 수 있습니다. 미리보기 이미지에 표시하기 전에 이미지의 크기를 줄여야합니다.

Android 교육 센터의 주제는 handling bitmaps efficiently이며 문제를 해결하는 데 도움이됩니다.

+0

방금 ​​생성 된 이미지를 축소하면 전체 화면으로 어떻게 확장 할 수 있습니까? 내 ImageView 속성을 모두 "match_parent"로 설정했습니다. 자동으로 스트레칭이 수행됩니까? 조언 해주셔서 감사합니다! – user2410644

+1

@ user2410644보기의'setScaleType'을 사용하여 배경 화면을 어떻게 표시 할 것인지 결정할 수 있습니다. 가장 잘 보이는 모양 일 수 있습니다. 'setAdjustViewBounds (true)'를 사용해야 할 수도 있습니다. –

1

작은 축소판을 보여주는 세그먼트를 제공하려는 경우 적절한 크기의 작은 축소판을로드해야합니다. 전체 크기로 이미지를로드하지 마십시오. 리소스를 제어 할 수 있다면 300x250 크기의 작은 미리보기 이미지를로드 할 수 있습니다. 그들이 적절한 미리보기 이미지를 선택하면 해당 이미지를 대응하는 전체 이미지의지도로 사용하고로드합니다.

메모리에 맞는지 확인하는 것이 가장 좋습니다. Google에서 제공하는 loading of bitmaps efficiently 링크를 따라 여러 가지 방법이 있습니다. 그러나

private Bitmap getImage(String path) 
{ 
    try 
    { 
     final int sizeFactors[] = { 1, 2, 4, 8, 16, 32 }; 

     if (new File(path).exists()) 
     { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      for (int i = 0; i < sizeFactors.length; ++i) 
      { 
       try 
       { 
        options.inSampleSize = sizeFactors[i]; 
        Bitmap bmp = BitmapFactory.decodeFile(path, options); 

        if(bmp.getHeight() > MyImageView.MAXIMUM_BITMAP_HEIGHT || 
         bmp.getWidth() > MyImageView.MAXIMUM_BITMAP_WIDTH) 
        { 
         continue; 
        } 

         /* 
         * @category Check against EXIF data if the image needs to be rotated or not for viewing. 
         */ 
         Matrix matrix = new Matrix(); 
         ExifInterface exif = new ExifInterface(path); 
         int orientation = exif.getAttributeInt (ExifInterface.TAG_ORIENTATION, 1); 
         switch(orientation) 
         { 
          case ExifInterface.ORIENTATION_NORMAL: 
           break; 
          case ExifInterface.ORIENTATION_ROTATE_90: 
           matrix.postRotate (90); 
           break; 
          case ExifInterface.ORIENTATION_ROTATE_180: 
           matrix.postRotate (180); 
           break; 
          case ExifInterface.ORIENTATION_ROTATE_270: 
           matrix.postRotate (270); 
           break; 
          default: 
         } 

         bmp = Bitmap.createBitmap (bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 

         return bmp; 
        } catch (OutOfMemoryError outOfMemory) 
        { 
         Log.d("MyLog", "Resampling to fit the image on the screen."); 
        } 
       } 
       throw new Exception("Not enough memory for loading image"); 
      } 
     } catch (Exception e) 
     { 
      Log.w("MyLog", "Exception."); 
     } 
     return null; 
    } 
관련 문제