2016-08-17 5 views
1

나는 여기에 내 코드에서 frameLayout에 캔버스를 그려 넣으 려하고 있지만 null 객체 참조 예외가 발생했습니다. 그건 그렇고 내가 Color.BLACK 변경하면 아무것도 검은 사각형을 표시하고 오류를 제공합니다.drawColor에서 안드로이드 Null 포인터 예외

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); 
    } 
} 

내 활동 레이아웃 코드가 여기에 있습니다 : 나는 안드로이드 스튜디오 2.1 genymotion 안드로이드 에뮬레이터 6.0 마시 멜로 그런 식이다

오류를 사용합니다.

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

내 활동 클래스 문제는 캔버스 lockCanvas가 null에서 반환 된 여기

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

답변

1

입니다.

인용 워드 프로세서 :

반환 캔버스 표면의 비트 맵으로 그리는 데 사용 할 수 있습니다. A 표면이 작성되지 않았거나 을 편집 할 수없는 경우 널이 리턴됩니다. 서페이스가 언제 에 사용 가능한지 알아 보려면 Callback.surfaceCreated를 구현해야합니다.

따라서 Callback.surfaceCreated을 구현하고 surfaceCreated가 호출 된 후 캔버스 편집을 시작해야합니다.

+1

감사 surfacedestroyed 메서드가 작동했습니다. 파괴 된 mRun을 false로 지정하면 오류가 사라집니다. –

관련 문제