java - 使用 SurfaceView 时锁定 Canvas 失败且 Canvas 为空

标签 java android android-canvas

Android SurfaceView的问题。 我想在SurfaceView中画一个Circle,但是在SimpleDraw方法中canvas为null。为什么? 否 1, Canvas 为空。 否2,SimpleDraw方法在ClickListener中运行,是对的,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);
    }

}

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

}

最佳答案

区别在于时间。

没有。 1 尝试在创建 Canvas 之前绘制 Canvas ,但失败。对 sfh.lockCanvas(...) 的调用失败并返回 null,而不是 Canvas

没有。 2 创建 Canvas 后尝试绘制,因此可以正常工作。

这样做:

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(this);

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

关于java - 使用 SurfaceView 时锁定 Canvas 失败且 Canvas 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9510792/

相关文章:

java - Leopard 上各种 com.sun.* 包的 Java 源代码在哪里?

java - 任何人都可以用 java 中的示例示例解释什么是回调方法吗?

android - Bottom Sheet 对话框横向宽度问题

javascript - 如何将 pdf 嵌入到 android 浏览器的 html 页面中

android - 这段代码的结构是否适合它的用途?我如何在 Android 中平滑动画?

android - 如何将位图覆盖在另一个位图上

java - Spring JPA Repository n+1 问题,EBEAN 替代方案

java - 如何将 Java 中的此 SHA 函数转换为 Ruby 中的等效函数?

java - 如何在获取最后位置时解决 mLastLocation、mLatitudeText、mLongitudeText

java - 西蒙说安卓游戏