2012-03-01 5 views
2

Android SurfaceViewの質問。 サーフェスをSurfaceViewで描画したいが、キャンバスがSimpleDrawメソッドでnullである。なぜですか? いいえ1、キャンバスはnullです。 いいえ2、ClickListenerで実行されるSimpleDrawメソッドは正しく、キャンバスはnullではありません、なぜですか?SurfaceViewを使用するとキャンバスが失敗しキャンバスがヌルになる

1.public class SurfaceTestActivity extends Activity { 
SurfaceView sfv; 
SurfaceHolder sfh; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sfv=(SurfaceView)findViewById(R.id.surface); 
    sfh=sfv.getHolder(); 
    SimpleDraw(); 

} 

void SimpleDraw(){ 
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300, 
      getWindowManager().getDefaultDisplay().getHeight())); 
    Paint mPaint = new Paint(); 
    mPaint.setColor(Color.GREEN); 
    mPaint.setStrokeWidth(2); 
    canvas.drawCircle(150, 150, 80, mPaint); 
    sfh.unlockCanvasAndPost(canvas); 
    } 

}

2.public class SurfaceTestActivity extends Activity { 
Button simpleButton; 
SurfaceView sfv; 
SurfaceHolder sfh; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    simpleButton=(Button)findViewById(R.id.simple); 
    sfv=(SurfaceView)findViewById(R.id.surface); 
    sfh=sfv.getHolder(); 
    simpleButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      //SimpleDraw(); 
     } 
    }); 
} 

void SimpleDraw(){ 
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300, 
      getWindowManager().getDefaultDisplay().getHeight())); 
    Paint mPaint = new Paint(); 
    mPaint.setColor(Color.GREEN); 
    mPaint.setStrokeWidth(2); 
    canvas.drawCircle(150, 150, 80, mPaint); 
    sfh.unlockCanvasAndPost(canvas); 
    } 

}

+0

私はあなたの質問でちょっと混乱していますが、「No2、SimpleDrawメソッドをClickListenerで実行すると正しいですか?キャンバスはnullではありません。なぜですか?」 'onClick'メソッドの' SimpleDraw() 'への呼び出しがコメントアウトされて実行されないためですか? – edthethird

+0

私は中国人です、英語はうまくありません.2人は実行できません.1人と2人は違っています。 – user1241763

答えて

2

差がタイミングです。

No.1キャンバスが作成されて失敗する前にキャンバスに描画しようとします。 sfh.lockCanvas(...)への呼び出しが失敗し、ではなくnullが返されます。

No.2キャンバスが作成された後に描画しようとします。

public class SurfaceTestActivity extends Activity implements SurfaceHolder.Callback { 
SurfaceView sfv; 
SurfaceHolder sfh; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sfv=(SurfaceView)findViewById(R.id.surface); 
    sfh=sfv.getHolder(); 
    sfh.addCallback(this); 

} 

void SimpleDraw(){ 
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300, 
      getWindowManager().getDefaultDisplay().getHeight())); 
    Paint mPaint = new Paint(); 
    mPaint.setColor(Color.GREEN); 
    mPaint.setStrokeWidth(2); 
    canvas.drawCircle(150, 150, 80, mPaint); 
    sfh.unlockCanvasAndPost(canvas); 
} 



@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // draw AFTER surface created! 
    simpleDraw(); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 

} 

CHANGES: - キャンバスが作成された後

SimpleDraw新しいと3つの@Overrideメソッドを追加sfh.addCallback(this);

を追加SurfaceHolder.Callback

を追加

はこれを行います。

+0

作成完了ですか? – user1241763

+0

'surfaceCreated(...)'が呼び出されますが、これには 'sfh.addCallback(this);'が必要です。 – edthethird

関連する問題