Android绘图颜色空指针异常

问题描述:

我有一些问题,在我的代码中我想绘制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(); 

的问题是,在画布返回从lockCanvas为空。

引用文档:

返回画布可用于绘制表面的位图。 A 如果曲面尚未创建或以其他方式无法编辑 ,则返回null。您通常需要执行 Callback.surfaceCreated以了解Surface何时可以使用 。

因此,您必须实施Callback.surfaceCreated并在调用surfaceCreated后开始编辑画布。

+1

谢谢surfacedestroyed方法的工作。当我将mRun分配给false时,错误消失了。 –