Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SurfaceView时锁定画布失败且画布为空_Java_Android_Android Canvas - Fatal编程技术网

Java 使用SurfaceView时锁定画布失败且画布为空

Java 使用SurfaceView时锁定画布失败且画布为空,java,android,android-canvas,Java,Android,Android Canvas,Android SurfaceView的问题。 我想在SurfaceView中画一个圆,但在SimpleDraw方法中canvas是空的。为什么? 否1,画布为空。 第二,在ClickListener中运行的SimpleDraw方法是正确的,canvas不是null,为什么 1.public class SurfaceTestActivity extends Activity { SurfaceView sfv; SurfaceHolder sfh; /** Called when the a

Android SurfaceView的问题。 我想在SurfaceView中画一个圆,但在SimpleDraw方法中canvas是空的。为什么? 否1,画布为空。 第二,在ClickListener中运行的SimpleDraw方法是正确的,canvas不是null,为什么

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


}区别在于时间

No.1尝试在画布创建之前绘制画布,但失败。调用
sfh.lockCanvas(…)
失败并返回
null
,而不是
Canvas

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) {

}
变化:

添加
SurfaceHolder.Callback

添加
sfh.addCallback(此)


创建画布后,使用新的
SimpleDraw
添加3个
@Override
方法。

我被你的问题弄糊涂了,你能澄清一下“2号,SimpleDraw方法在ClickListener中运行,是对的,画布不是空的,为什么?”因为调用
SimpleDraw()
onClick
方法中的
被注释掉并且不会运行?我是中国人,英语不好。No 2可以运行。No 1和No 2有什么不同。
surfaceCreated(…)
将被调用,但这需要
sfh.addCallback(这个)
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) {

}