2011-11-07 4 views
1

をマルチタスクでギャラリーを使用して、私はpics.javaクラスを実行したときに、私はこのエラーを取得java.lang.OutOfMemoryErrorをは

11-07 20:23:15.468: E/AndroidRuntime(4294): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

これは私のpics.javaクラスです:

package kostas.menu.climb; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.os.Bundle; 
import android.util.FloatMath; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnTouchListener; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.Gallery; 
import android.widget.ImageView; 
import android.widget.AdapterView.OnItemClickListener; 

public class therisospics extends Activity implements OnTouchListener { 

    public Context cont; 

    private static final String TAG = "Touch"; 
     // These matrices will be used to move and zoom image 
     Matrix matrix = new Matrix(); 
     Matrix savedMatrix = new Matrix(); 

     // We can be in one of these 3 states 
     static final int NONE = 0; 
     static final int DRAG = 1; 
     static final int ZOOM = 2; 
     int mode = NONE; 

     // Remember some things for zooming 
     PointF start = new PointF(); 
     PointF mid = new PointF(); 
     float oldDist = 1f; 

     private Gallery gallery; 

     private Integer[] Imgid = { 
       R.drawable.kosm1,R.drawable.th2,R.drawable.th3,R.drawable.th4,R.drawable.th5,R.drawable.th6,R.drawable.th7,R.drawable.th8,R.drawable.th9,R.drawable.th10}; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gallery); 

     final ImageView view = (ImageView) findViewById(R.id.imageView); 

     view.setOnTouchListener(this); 
     view.setImageResource(Imgid[0]); 



     gallery = (Gallery) findViewById(R.id.examplegallery); 
     gallery.setAdapter(new AddImgAdp(this)); 

     gallery.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       view.setImageResource(Imgid[position]); 
      } 
     }); 
    } 


    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
      ImageView view = (ImageView) v; 

     // Dump touch event to log 
     dumpEvent(event); 

    // Handle touch events here... 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      Log.d(TAG, "mode=DRAG"); 
      mode = DRAG; 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      oldDist = spacing(event); 
      Log.d(TAG, "oldDist=" + oldDist); 
      if (oldDist > 10f) { 
      savedMatrix.set(matrix); 
      midPoint(mid, event); 
      mode = ZOOM; 
      Log.d(TAG, "mode=ZOOM"); 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      Log.d(TAG, "mode=NONE"); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
      // ... 
      matrix.set(savedMatrix); 
      matrix.postTranslate(event.getX() - start.x, 
        event.getY() - start.y); 
      } 
      else if (mode == ZOOM) { 
      float newDist = spacing(event); 
      Log.d(TAG, "newDist=" + newDist); 
      if (newDist > 10f) { 
       matrix.set(savedMatrix); 
       float scale = newDist/oldDist; 
       matrix.postScale(scale, scale, mid.x, mid.y); 
      } 
      } 
      break; 
     } 

     view.setImageMatrix(matrix); 
     return true; // indicate event was handled 
    } 


    private float spacing(MotionEvent event) { 
      float x = event.getX(0) - event.getX(1); 
      float y = event.getY(0) - event.getY(1); 
      return FloatMath.sqrt(x * x + y * y); 
     } 

    private void midPoint(PointF point, MotionEvent event) { 
      float x = event.getX(0) + event.getX(1); 
      float y = event.getY(0) + event.getY(1); 
      point.set(x/2, y/2); 
     } 


    private void dumpEvent(MotionEvent event) { 
      String names[] = { "DOWN" , "UP" , "MOVE" , "CANCEL" , "OUTSIDE" , 
       "POINTER_DOWN" , "POINTER_UP" , "7?" , "8?" , "9?" }; 
      StringBuilder sb = new StringBuilder(); 
      int action = event.getAction(); 
      int actionCode = action & MotionEvent.ACTION_MASK; 
      sb.append("event ACTION_").append(names[actionCode]); 
      if (actionCode == MotionEvent.ACTION_POINTER_DOWN 
       || actionCode == MotionEvent.ACTION_POINTER_UP) { 
       sb.append("(pid ").append(
       action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
       sb.append(")"); 
      } 
      sb.append("["); 
      for (int i = 0; i < event.getPointerCount(); i++) { 
       sb.append("#").append(i); 
       sb.append("(pid ").append(event.getPointerId(i)); 
       sb.append(")=").append((int) event.getX(i)); 
       sb.append(",").append((int) event.getY(i)); 
       if (i + 1 < event.getPointerCount()) 
       sb.append(";"); 
      } 
      sb.append("]"); 
      Log.d(TAG, sb.toString()); 
     } 
    public class AddImgAdp extends BaseAdapter { 
     int GalItemBg; 
     private Context cont; 

     public AddImgAdp(Context c) { 
      cont = c; 
      TypedArray typArray = c.obtainStyledAttributes(R.styleable.Gallery1); 
      GalItemBg = typArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); 
      typArray.recycle(); 
     } 

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

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

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imgView = new ImageView(cont); 

      imgView.setImageResource(Imgid[position]); 
      imgView.setLayoutParams(new Gallery.LayoutParams(80, 70)); 
      imgView.setScaleType(ImageView.ScaleType.FIT_XY); 
      imgView.setBackgroundResource(GalItemBg); 

      return imgView; 
     } 
    } 

} 

どのように私できましたsetImageBitmap(null)? ? それが解決策になるだろうおかげ

PS:私の描画可能なフォルダがあなたの描画可能なフォルダは2メガバイト、約2メガバイト

答えて

1

ですが、これらの画像は、非圧縮されると、彼らはより多くのメモリを取るつもりです。ディスプレイ上で拡大縮小するのではなく、画像がデバイスに適したサイズに拡大縮小されていることを確認する必要があります。

+0

私の画像サイズは700 * 460です...それは大丈夫ですか、それとももっと小さいサイズで取得しなければなりませんか? –

関連する問題