2012-02-26 2 views
3

У меня есть класс, который расширяет представление. Этот класс имеет переменную-член mCanvasпеременная члена null после возврата функции?

private Canvas mCanvas; 

Эта переменная создается, когда представление изменяет размер, поэтому соответствующие размеры для холста установлены:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    int curW = mBitmap != null ? mBitmap.getWidth() : 0; 
    int curH = mBitmap != null ? mBitmap.getHeight() : 0; 
    if (curW >= w && curH >= h) { 
     return; 
    } 

    if (curW < w) curW = w; 
    if (curH < h) curH = h; 

    Bitmap canvasBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(canvasBitmap); 
    if (mBitmap != null) { 
     mCanvas.drawBitmap(mBitmap, 0, 0, null); 
    } 
    mBitmap = canvasBitmap; 
} 

Но в моей OnDraw функции я получаю исключение нулевого указателя, когда я пытаюсь получить ширину/высоту моего холста. Я был не уверен, когда onSizeChanged на самом деле вызван, я предполагал, что он всегда будет вызван, когда будет создан вид, и поэтому перед onDraw.

Но если мой OnDraw начинается с этого:

@Override 
protected void onDraw(Canvas canvas) { 
    if (mBitmap != null) { 
     if(mCanvas == null) 
     { 
      Log.d("testing","mCanvas is null" 
     } 

LogCat всегда показывает сообщение "mCanvas является нулевой", когда я достичь OnDraw.

Так я изменил код так, что если mCanvas равно нулю, когда я прочитал OnDraw я просто создать его снова:

private void resizeCanvas() 
{ 
    int curW = mBitmap != null ? mBitmap.getWidth() : 0; 
    int curH = mBitmap != null ? mBitmap.getHeight() : 0; 

    if (curW >= this.getWidth() && curH >= this.getHeight()) { 
     return; 
    } 

    if (curW < this.getWidth()) curW = this.getWidth(); 
    if (curH < this.getHeight()) curH = this.getHeight(); 

    Bitmap canvasBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(canvasBitmap); 

    if (mBitmap != null) { 
     mCanvas.drawBitmap(mBitmap, 0, 0, null); 
    } 

    mBitmap = canvasBitmap; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    if (mBitmap != null) { 
     if(mCanvas == null) 
     { 
      resizeCanvas(); 
      if(mCanvas == null) 
      { 
       Log.d("test","canvas is still null"); 
      } 

LogCat еще печатает «холст еще пустой»

Может кто-то объяснить, что здесь происходит? Я очень новичок в андроиде, и большая часть этого кода взята из примера touchpaint, с которым я играл.

Если я проверяю внутри resizeCanvas, если mCanvas имеет значение null, он всегда говорит, что он не является нулевым. Но если я проверю сразу после вызова этой функции, она всегда равна нулю.

ответ

4

Я думаю, проблема в вашем resizeCanvas, поскольку вы можете вернуться от него до инициализации mCanvas.

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