2014-08-29 3 views
0

gridview에 내 이미지 (드로어 블 폴더에 저장)를 보여주고 싶습니다. 12 이미지가 있습니다. 이를 위해 ImageAdapter 클래스를 만들었습니다. GridViewActivity를 열면 "메모리 부족 : 비트 맵 크기가 VM 예산을 초과합니다"라는 말로 인해 응용 프로그램이 중단됩니다. 여기에 코드가 있습니다.비트 맵 크기가 VM 예산을 초과합니까?

ImageAdapter.java

public class ImageAdapter extends BaseAdapter { 

Context context; 

Integer[] imageIDs = { R.drawable.lw01_04_001, R.drawable.lw01_04_002, 
     R.drawable.lw01_04_003, R.drawable.lw01_04_004, 
     R.drawable.lw01_04_005, R.drawable.lw01_04_006, 
     R.drawable.lw01_04_007, R.drawable.lw01_04_008, 
     R.drawable.lw01_04_009, R.drawable.lw01_04_010, 
     R.drawable.lw01_04_011, R.drawable.lw01_04_012, }; 

public ImageAdapter(Context ctx) { 
    context = ctx; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return imageIDs.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ImageView imageView; 

    if (convertView == null) { 
     imageView = new ImageView(context); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(5, 5, 5, 5); 
    } else { 
     imageView = (ImageView) convertView; 
    } 
    imageView.setImageResource(imageIDs[position]); 
    return imageView; 
    } 
} 

GridViewActivity.java

public class GridViewActivity extends ActionBarActivity { 

private Utils utils; 
private ImageAdapter imageAdapter; 
private GridView gridView; 
private int columnWidth; 
Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_grid_view); 

    context = this; 
    gridView = (GridView) findViewById(R.id.grid_view); 

    utils = new Utils(this); 

    // Initilizing Grid View 
    InitilizeGridLayout(); 

    imageAdapter = new ImageAdapter(context); 

    // setting grid view adapter 
    gridView.setAdapter(imageAdapter); 
} 
+0

이미지를 모바일 장치에 표시하기에 적합한 축소판 크기로 다운 스케일 – CSmith

+0

비슷하지만 완전히 중복되지는 않습니다. –

답변

0

귀하의 이미지는 아마 너무 큽니다. ImageView에 이미지 리소스 ID를 지정하면 ImageView는 해당 리소스의 비트 맵을 생성 한 다음 메모리에 유지합니다. 대부분의 최신 기기는 여러 개의 큰 이미지를 쉽게 처리 할 수있는 충분한 메모리로 제작되지만 Android는 각 앱에 매우 적은 양의 메모리를 할당합니다. 즉, 이미지 작업을 할 때, 특히 이미지를 많이 표시해야하는 경우에는 영리해야합니다. 여기

은 몇 가지 옵션이 있습니다 :

  1. 당신의 당김 폴더의 이미지들이해야보다 크지 있는지 확인합니다 (즉, 그들은 그들을 표시하는 것 뷰의 크기 이하 여야한다). 메모리 요구 사항을 줄이는 것 외에도 결과 APK 파일의 크기도 줄일 수 있으므로이 방법이 가장 좋습니다.

  2. 드로어 블 폴더에서 이미지의 크기를 줄이려면 (예를 들어, 사용자가 클릭하면 전체 크기로 표시해야 할 수도 있음) 런타임에 이미지의 크기를 줄입니다. 이 옵션을 사용하면 코드가 더 필요하지만 메모리 부족 문제가 발생하지 않고 필요한 방식으로 정확하게 이미지를 표시 할 수 있습니다.

여기에 옵션 # 2에 대한 코드 예제 :

Options opts = new Options(); 
    opts.outWidth = 85; //Based on your size requirement. 
    opts.outHeight = 85; 
    Bitmap b = BitmapFactory.decodeResource(getResources(), imageIDs[position], opts); 
    imageView.setImageBitmap(b); 

이것은 당신이 시작할 수 있어야합니다.

관련 문제