use*_*066 6 multithreading android surfaceview
我使用的是默认的SurfaceView实现,代码可以在这里找到(这是一个手指绘图的应用程序示例,我只是禁用它并绘制图像).有3个主要的独立课程 -
SurfaceView绘制在构造函数中设置的图像(Bitmap).我还实现了用户可以调用相机应用程序并拍照的功能.图片必须交换默认图像(在SurfaceView构造函数集图像上).
我试图在我的活动类中创建一个简单的方法并设置位图,但这不起作用:
private void setImage() {
view.bitmap = this.mImageBitmap;
}
Run Code Online (Sandbox Code Playgroud)
我以为SurfaceView线程可能正在使用位图,所以我试图锁定变量:
private void setImage() {
synchronized (view.bitmap) {
view.bitmap = this.mImageBitmap;
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序也崩溃了.
SurfaceView绘制方法:
protected void onDraw(Canvas canvas) {
setPaintProperties();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
synchronized ( this.bitmap ) {
canvas.drawBitmap(this.bitmap, 0, 0, new Paint() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在调用构造函数后更改SurfaceView中的位图变量?
你的运行方法是什么样的。我会看一下月球着陆器样本。您需要锁定和解锁画布。
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) updatePhysics();
doDraw(c);
}
} finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)