Android SurfaceView并返回包含所有绘制调用的位图

时间:2015-01-22 01:41:53

标签: android bitmap

我正在使用SurfaceView,因此我可以创建一个单独的线程用于绘图。 我的问题是如何获取我绘制到画布的屏幕上当前像素的位图。 这是一些基本概述的代码:

class SurfaceRenderView extends SurfaceView implements Runnable {
    SurfaceHolder holder;
    Thread thread;
    Canvas canvas;

    public SurfaceRenderView(Context context) {
        super(context);
        holder = getHolder(); //holder for Canvas so I can draw in my thread
        thread = new Thread(this);
        thread.start();
    }

    @Override 
    public void run() {
        // thread has started
        while(true) {
            if(holder.getSurface().isValid()) {
                canvas = holder.lockCanvas();
                // do some drawing...
                holder.unlockCanvasAndPost(canvas);
            }
        } 
    } 
}

}

所以我想得到一个优秀的位图,封装我绘制到SurfaceView画布上的所有位图。因为没有方法getBitmap()返回我整个SurfaceView的位图,我需要一些其他方法来实现这一点。请帮帮我。 谢谢!

1 个答案:

答案 0 :(得分:0)

首先,你的例子失败了,因为lockCanvas只能在UI线程中工作,这真的很痛苦,所以我从不使用SurfaceView。

但是由于你坚持使用SurfaceView,这里有一个提示:你创建自己的位图绘制其中的所有内容并将其提供给SurfaceHolder只是为了绘图。这就是您的应用程序可用位图的方式。这可能比在SurfaceHolder上绘制效率低,因为在这种情况下图形加速不起作用。

该示例假定在表面准备好之后初始化线程,因此您知道视图的宽度和大小。 (您可能应该使用AsyncTask而不是Thread,但我相当老式:))

public class DrawingThread extends Thread  {
     Activity activity;
     SurfaceView view;;
     Bitmap backBuffer;
     boolean bufferProcessed;
     public DrawingThread(Activity activity, SurfaceView view) {
          this.activity = activity;
          this.view = view;
          backBuffer = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Config.ARGB_8888);          
     }

     @Override
     public void run() {
          try {
               for (;;) {
                   Canvas canv = new Canvas(backBuffer);
                   // Draw on canvas  
                   .....................................  
                   bufferProcessed = false;

                   activity.runOnUiThread(new Runnable() {
                       public void run() {
                          SurfaceHolder holder = view.getHolder();
                          Canvas hCanv = holder.lockCanvas();
                          hCanv.drawBitmap(backBuffer, 0f, 0f, null);
                          holder.unlockCanvasAndPost(hCanv);
                          synchronized(DrawingThread.this) {
                               bufferProcessed = true;
                               DrawingThread.this.notify(); 
                          }
                       }
                   });  

                   while(!bufferProcessed) 
                      synchronized(this) {wait();}

               }
           }catch(InterruptedException ex) {}


     }


}