2013-10-09 3 views
0

У меня возникла проблема. У меня есть прослушиватель сообщений, где я рисую масштабированную версию растрового изображения. Проблема связана с тем, что я стараюсь делать масштабирование каждый раз при масштабировании (увеличение масштаба, уменьшение масштаба). Проблема в том, что я не в состоянии переработать битовую карту, потому что, когда я пытаюсь сделать это после нанесенияBitmap.recycle() Вызываю его после рисования

canvas.draw(scaledbitmap,0,0,null); 
scaledBitmap.recycle() 

я получаю Canvas Канот рисовать переработаны растрового изображения за исключением

Кто-нибудь знает, как бы я идти о рециркуляции растровое изображение после того, как я закончил с ним, чтобы потом еще можно было масштабировать, и я не получаю крах OutOfMemoryException.

код, чтобы показать вам, как именно я использую его:

private SpenDrawListener mPosteDrawListener = new SpenDrawListener() { 

     @Override 
     public void onDraw(Canvas canvas, float x, float y, float ratio, 
      float frameStartX, float frameStartY, RectF updateRect) { 
      if(mLineDrawingBitmap == null) 
       mLineDrawingBitmap = loadLineDrawingBitmap(mLineDrawingFileName); 

      Bitmap bm = Bitmap.createScaledBitmap(mLineDrawingBitmap, (int)(mLineDrawingBitmap.getWidth() * ratio), (int)(mLineDrawingBitmap.getHeight() * ratio), true); 
      /* 
      float pointX = (mScreenRect.width() - bm.getWidth())/2; 
      float pointY = mScreenRect.height()/2 - bm.getHeight(); 
      */ 
      float pointX = frameStartX - (x * ratio); 
      float pointY = frameStartY - (y * ratio); 

      //canvas.drawBitmap(bm, 0, 0,null); 
      canvas.drawBitmap(bm, pointX, pointY, null); 

      //bm.recycle(); 
     } 
    }; 

ответ

0

После нескольких часов проб и ошибок я понял, как масштабировать красиво и не врезаться приложение с OutOfMemoryException: Ниже код для рисования и масштабирования во время выполнения без сбоя (пока изображение не слишком велико при декодировании). Я буду использовать свой собственный PostDrawListener, но я считаю, что его можно использовать в любом месте с незначительными модификациями

private SpenDrawListener mPosteDrawListener = new SpenDrawListener() { 
    @Override 
    public void onDraw(Canvas canvas, float x, float y, float ratio, 
     float frameStartX, float frameStartY, RectF updateRect) { 
     if(mLineDrawingBitmap == null) 
       mLineDrawingBitmap = loadLineDrawingBitmap(mLineDrawingFileName); 

     float pointX = frameStartX - (x * ratio); 
     float pointY = frameStartY - (y * ratio); 

     //Create a new Matrix 
     Matrix m = new Matrix(); 
     //Use any scaling ratio you want 
     m.postScale(ratio, ratio); 
     //Use any translation you want 
     m.postTranslate(pointX, pointY); 
     //when using below call you will not be creating a new bitmap, just 
     //using the original with runtime modifications  
     canvas.drawBitmap(mLineDrawingBitmap, m, null); 

    } 
}; 
Смежные вопросы