如何在SurfaceView中动态更改图像?

时间:2013-01-24 12:28:20

标签: android multithreading surfaceview

我正在使用默认的SurfaceView实现,可以找到代码here(这是一个手指绘图应用示例,我只是禁用它并绘制图像)。有3个主要单独的类 -

  1. 活动类( SurfaceViewSampleActivity
  2. SurfaceView( CanvasView
  3. 主题类( UIThread )。
  4. SurfaceView绘制在构造函数中设置的图像(位图)。我还实现了用户可以调用相机应用程序并拍照的功能。 图片必须交换默认图像(在SurfaceView构造函数集图像上)。

    我尝试在我的activity类中创建一个简单的方法并设置位图,但这不起作用:

    private void setImage() {
        view.bitmap = this.mImageBitmap; 
    
    }
    

    我认为SurfaceView线程可能正在使用位图,所以我试图锁定变量:

    private void setImage() {   
        synchronized (view.bitmap) {
            view.bitmap = this.mImageBitmap;
        }   
    }
    

    应用程序也崩溃了。

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

    在调用构造函数之后,有没有办法在SurfaceView 中更改位图变量?

1 个答案:

答案 0 :(得分:1)

你的跑步方法是什么样的。我会看一下Lunar Lander样本。你需要锁定和解锁画布。

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