2017-06-09 7 views
0

ここでは、フルスクリーン画像が表示されるメモリ不足の問題があります。私はフルスクリーンで画像を表示したいと思うし、左または右に2つのボタンがあります。メモリ不足の例外を防ぐために、次の画像を表示する前に、過去の画像をリサイクルするにはどうすればよいですか?それとももっと良い方法がありますか?アンドロイド新しい画像をロードする前に画像をリサイクルする方法

ここで私は画像を見る私のクラスです。

public class ImageViewActivity extends Activity 
{ 
private Button btnHome; 
private Button btnBack; 
private ImageButton btnLeft; 
private ImageButton btnRight; 
ImageView imageView; 
RelativeLayout layout; 

int height; 
int width; 

Bitmap bitmap; 
String[] imagesPath; 
int position; 

// 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; 
String savedItemClicked; 

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

    btnHome = (Button) findViewById(R.id.btnHome); 
    btnBack = (Button) findViewById(R.id.btnBack); 
    btnLeft = (ImageButton) findViewById(R.id.leftArrow); 
    btnRight = (ImageButton) findViewById(R.id.rightArrow); 

    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    height = displayMetrics.heightPixels; 
    width = displayMetrics.widthPixels; 

    imagesPath = getIntent().getStringExtra("IMAGES").split("\\|"); 
    position = getIntent().getIntExtra("POSITION", 0); 

    bitmap = BitmapFactory.decodeFile(imagesPath[position]); 

    imageView = (ImageView)findViewById(R.id.displayImage); 
    imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, width, height, false)); 

    btnLeft.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      if (position == 0) 
       position = 5; 
      else 
       position--; 

      RectF imageRectF = new RectF(0, 0, width, height); 
      RectF viewRectF = new RectF(0, 0, width, height); 
      matrix.setRectToRect(imageRectF, viewRectF, Matrix.ScaleToFit.CENTER); 

      bitmap = BitmapFactory.decodeFile(imagesPath[position]); 
      ImageView imageView = (ImageView)findViewById(R.id.displayImage); 
      imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, width, height, false)); 

      imageView.setImageMatrix(matrix); 
     } 
    }); 

    btnRight.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      if (position == 5) 
       position = 0; 
      else 
       position++; 

      RectF imageRectF = new RectF(0, 0, width, height); 
      RectF viewRectF = new RectF(0, 0, width, height); 
      matrix.setRectToRect(imageRectF, viewRectF, Matrix.ScaleToFit.CENTER); 

      bitmap = BitmapFactory.decodeFile(imagesPath[position]); 
      ImageView imageView = (ImageView)findViewById(R.id.displayImage); 
      imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, width, height, false)); 

      imageView.setImageMatrix(matrix); 
     } 
    }); 

    btnHome.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      Intent ActivitySwitch = new Intent(getApplicationContext(), MainMenuActivity.class); 
      startActivity(ActivitySwitch); 
     } 
    }); 

    btnBack.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      Intent ActivitySwitch = new Intent(getApplicationContext(), AddClientActivity.class); 
      startActivity(ActivitySwitch); 
     } 
    }); 

    imageView.setOnTouchListener(new View.OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      ImageView view = (ImageView) v; 
      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()); 
        mode = DRAG; 
        break; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        oldDist = spacing(event); 
        if (oldDist > 10f) { 
         savedMatrix.set(matrix); 
         midPoint(mid, event); 
         mode = ZOOM; 
        } 
        break; 
       case MotionEvent.ACTION_UP: 
       case MotionEvent.ACTION_POINTER_UP: 
        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); 
         if (newDist > 10f) { 
          matrix.set(savedMatrix); 
          float scale = newDist/oldDist; 
          matrix.postScale(scale, scale, mid.x, mid.y); 
         } 
        } 
        break; 
      } 

      view.setImageMatrix(matrix); 
      return true; 
     } 
    }); 

} 

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("]"); 
} 

/** Determine the space between the first two fingers */ 
private float spacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return (float)Math.sqrt(x * x + y * y); 
} 

/** Calculate the mid point of the first two fingers */ 
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); 
} 

入力いただきありがとうございます。追加情報が必要な場合はお気軽にお問い合わせください。

答えて

1

私は最初想像しました。私はこれを単に追加しました。

bitmap.recycle(); 

私は新しいイメージに私のビットマップを宣言する前に。

1

私は画像を縮小またはピカソ画像ローディングライブラリを使用して検討すると、次のいずれかhttp://square.github.io/picasso/

それは本当に簡単に使用することもあり、メモリの例外のうち多くを防ぐことができます。

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 
関連する問題