2013-10-09 21 views
0

我遇到問題。我有一個帖子繪製偵聽器,我繪製了一個縮放版本的位圖。問題源於這樣一個事實,即每次發生縮放時我傾向於進行一些縮放(放大放大,縮小縮小)。問題是我不能夠循環利用的位圖,因爲當我試着畫後這樣做Bitmap.recycle()繪圖後調用它

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

我得到的帆布canot抽籤回收位例外

有誰知道我怎麼會去再造一個位圖完成後,以便可以縮放另一個位置,並且不會發生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); 

    } 
}; 
相關問題