2012-10-01 6 views
-8

있어 코드 : Coverflow커버 플로우 가진 OOM 예외

나는 완료, 수직 하나를 만드는 데 필요한 것을, 하지만, 너무 (I를 메모리 문제가를 몇 가지 방법이 있지만 전체 방법은 동일을 변경하여 안드로이드 2.2에서 구축 중이다.). 드로어 블에서 이미지를 사용해야합니다. 어떤 사람이이 샘플을 사용했다면, 메모리 문제를 어떻게 관리했는지 말해 주실 수 있습니까?

주요 클래스는 이것이다 :

package com.example.coverflow; 




     import java.io.FileInputStream; 
     import java.io.FileOutputStream; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.graphics.Canvas; 
    import android.graphics.LinearGradient; 
    import android.graphics.Matrix; 
    import android.graphics.Paint; 
    import android.graphics.PorterDuffXfermode; 
    import android.graphics.Bitmap.CompressFormat; 
    import android.graphics.Bitmap.Config; 
    import android.graphics.PorterDuff.Mode; 
    import android.graphics.Shader.TileMode; 
    import android.graphics.drawable.BitmapDrawable; 
    import android.os.Bundle; 
     import android.util.Log; 
     import android.view.View; 
     import android.view.ViewGroup; 
     import android.widget.BaseAdapter; 
     import android.widget.ImageView; 
     import android.widget.ImageView.ScaleType; 


     public class CoverFlowExample extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    CoverFlow coverFlow; 
    coverFlow = new CoverFlow(this); 

    coverFlow.setAdapter(new ImageAdapter(this)); 

    ImageAdapter coverImageAdapter = new ImageAdapter(this); 

    coverImageAdapter.createReflectedImages(); 

    coverFlow.setAdapter(coverImageAdapter); 

    coverFlow.setSpacing(-15); 
    coverFlow.setSelection(8, true); 


    setContentView(coverFlow); 

    //Use this if you want to use XML layout file 
    //setContentView(R.layout.main); 
    //coverFlow = (CoverFlow) findViewById(R.id.coverflow); 


} 

public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Context mContext; 

    private FileInputStream fis; 

    private Integer[] mImageIds = { 
      R.drawable.kasabian_kasabian, 
      R.drawable.starssailor_silence_is_easy, 
      R.drawable.killers_day_and_age, 
      R.drawable.garbage_bleed_like_me, 
      R.drawable.death_cub_for_cutie_the_photo_album, 
      R.drawable.kasabian_kasabian, 
      R.drawable.massive_attack_collected, 
      R.drawable.muse_the_resistance, 
      R.drawable.starssailor_silence_is_easy 
    }; 

    private ImageView[] mImages; 

    public ImageAdapter(Context c) { 
     mContext = c; 
     mImages = new ImageView[mImageIds.length]; 
    } 
    public boolean createReflectedImages() { 
      //The gap we want between the reflection and the original image 
      final int reflectionGap = 4; 


      int index = 0; 
      for (int imageId : mImageIds) { 
       Bitmap originalImage = BitmapFactory.decodeResource(getResources(), 
         imageId); 
       int width = originalImage.getWidth(); 
       int height = originalImage.getHeight(); 


       //This will not scale but will flip on the Y axis 
       Matrix matrix = new Matrix(); 
       matrix.preScale(1, -1); 

       //Create a Bitmap with the flip matrix applied to it. 
       //We only want the bottom half of the image 
       Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2, width, height/2, matrix, false); 


       //Create a new bitmap with same width but taller to fit reflection 
       Bitmap bitmapWithReflection = Bitmap.createBitmap(width 
        , (height + height/2), Config.ARGB_8888); 

       //Create a new Canvas with the bitmap that's big enough for 
       //the image plus gap plus reflection 
       Canvas canvas = new Canvas(bitmapWithReflection); 
       //Draw in the original image 
       canvas.drawBitmap(originalImage, 0, 0, null); 
       //Draw in the gap 
       Paint deafaultPaint = new Paint(); 
       canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint); 
       //Draw in the reflection 
       canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null); 

       //Create a shader that is a linear gradient that covers the reflection 
       Paint paint = new Paint(); 
       LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, 
       bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, 
       TileMode.CLAMP); 
       //Set the paint to use this shader (linear gradient) 
       paint.setShader(shader); 
       //Set the Transfer mode to be porter duff and destination in 
       paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
       //Draw a rectangle using the paint with our linear gradient 
       canvas.drawRect(0, height, width, 
       bitmapWithReflection.getHeight() + reflectionGap, paint); 

       ImageView imageView = new ImageView(mContext); 
       imageView.setImageBitmap(bitmapWithReflection); 
       imageView.setLayoutParams(new CoverFlow.LayoutParams(120, 180)); 
       imageView.setScaleType(ScaleType.MATRIX); 
       mImages[index++] = imageView; 

      } 
      return true; 
    } 

    public int getCount() { 
     return mImageIds.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     //Use this code if you want to load from resources 
     //ImageView i = new ImageView(mContext); 
     //i.setImageResource(mImageIds[position]); 
     //i.setLayoutParams(new CoverFlow.LayoutParams(130, 130)); 
     //i.setScaleType(ImageView.ScaleType.MATRIX);   
     //return i; 

     return mImages[position]; 
    } 
    /** Returns the size (0.0f to 1.0f) of the views 
    * depending on the 'offset' to the center. */ 
    public float getScale(boolean focused, int offset) { 
     /* Formula: 1/(2^offset) */ 
     return Math.max(0, 1.0f/(float)Math.pow(2, Math.abs(offset))); 
    } 

} 

}

+2

디버그 모드로 실행하고 메모리 오버플로를 일으키는 원인을 모니터링 해 보았습니까? – stealthjong

+0

나는 그것을 얻을 수 없다. 그래서 나는 샘플 코드의 링크를 업로드했다. – zaiff

답변

0
<com.example.coverflow.CoverFlow 
android:id="@+id/coverflow" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/> 

내가 유 따라 패키지 이름을 변경하지 않은 생각합니다.

관련 문제