2016-08-17 36 views
1

我有一些問題,在我的代碼中我想繪製frameLayout畫布,但我得到空對象引用異常。順便說一下,當我改變Color.BLACK沒有改變只顯示黑色的矩形,並給出錯誤。 我使用Android 2.1的工作室和genymotion Android模擬器6.0棉花糖Android繪圖顏色空指針異常

錯誤是這樣的:

Fatal Exception:main 
Process:com.example.myApp 
java.lang.NullPointerException : Attempt to invoke virtual method "void android.graphics.Canvas.rawColor(int)" on a null object reference 

public class MyCanvas extends SurfaceView implements SurfaceHolder.Callback{ 

    private boolean mRun= false; 
    private final SurfaceHolder mSurfaceHolder; 
    private final Object mRunLock = new Object(); 

    public MyCanvas(Context context, AttributeSet attrs){ 

     super(context,attrs); 
     this.setWillNotDraw(false); 
     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.AddCallback(this); 
    } 

    public synchronized void run(){ 

     if(mRun){ 

      Canvas c = null; 
      try{ 

       c = mSurfaceHolder.lockCanvas(); 
       synchronized (mSurfaceHolder){ 
        synchronized(mRunLock){ 
         if(mRun) doDraw(c); 
        } 

       } 

      }finally 
       if(c != null) 
       { mSurfaceHolder.unlockCanvasandPost(c); } 

     } 


    } 


    private void onDraw(Canvas canvas){ 
     canvas.drawColor(Color.YELLOW); 
    } 
} 

我的活動佈局代碼是在這裏。

<view class="com.example.myapp.MyCanvas" 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:lid="@+id/mycanvas" 
/> 

我的活動課就在這裏

MyCanvas myCanvas = (MyCanvas)findViewById(R.id.mycanvas); 
myCanvas.run(); 

回答

1

的問題是,在畫布返回從lockCanvas爲空。

引用文檔:

返回畫布可用於繪製表面的位圖。 A 如果曲面尚未創建或以其他方式無法編輯 ,則返回null。您通常需要執行 Callback.surfaceCreated以瞭解Surface何時可以使用 。

因此,您必須實施Callback.surfaceCreated並在調用surfaceCreated後開始編輯畫布。

+1

謝謝surfacedestroyed方法的工作。當我將mRun分配給false時,錯誤消失了。 –