2012-10-21 45 views
3

我一直在寻找如何将画布上的内容变成位图。我尝试了多种方法来实现这一点,比如将绘图缓存保存为位图,但最终的结果是背景位图闪烁一会儿,然后变成黑屏。测试图像显示在背景上,但不会被下一次调用OnDraw的背景覆盖。Android的画布到位图

MainThreading{ 

         ... 

       if(notuptodate == true){ 

         //call readyBackground to create the background bitmap 
         this.mainPanel.readyBackground(canvas); 
         //post the canvas 
         surfaceHolder.unlockCanvasAndPost(canvas); 
         //clean the Canvas 
         canvas = null; 
         //ready new Canvas 
         canvas = this.surfaceHolder.lockCanvas();//lock the canvas to enable editing 






        }//if not true 

        if (MainThreading.notuptodate == false){ 

         mainPanel.onDraw(canvas); 


        }//if false 
... 
       }//mainthreading 

    //this method is run first to create the Bitmap that on draw will use 
    public void readyBackGround(Canvas canvas){ 


     if (MainThreading.notuptodate){ 
      //method used to draw multiple Bitmaps onto the canvas 
      renderBackground(canvas); 

      //private Bitmap, this is the supposed proper size of the bitmap 
      backgroundBitmap=Bitmap.createBitmap(240, 320, Config.ARGB_8888); 


      //set the canvas to turn whats on its self onto the bitmap. 
      canvas.setBitmap(backgroundBitmap); 

      //set boolean flag to false so renderBackground won't be called 
      //untill it needs to be updated again 
      MainThreading.notUpToDate = false; 

     } 

     //this method is called when notUpToDate = true 
     @Override 
    protected void onDraw(Canvas canvas){ 


     if (this.threado.getBackground() != null){ 
      canvas.drawBitmap(backgroundBitmap, 0, 0, null); 

      } 

      //this if statement is never activated 
      if (this.threado.getBackground() == null){ 
       Log.d("background nonexistant", "Importante!"); 
      } 
      //draw test object onto background 
      test.DrawObject(canvas); 

       //when MainThreading.notUpToDate = true isn't commented out, the 
       //screen consistantly shows the background, but the test object isn't 
       //drawn 

     //MainThreading.notUpToDate = true; 





     } 

回答

7

试试这样...

-使用Bitmap.createBitmap()

创建正确大小的bitmap -创建一个指向canvas instance,使用Canvas(Bitmap)构造

此位图

- Draw to在canvas

-使用bitmap

+0

起初未出现解决我的问题,但我发现导致此错误。在OnDraw方法中,您会看到一些if语句引用了一些我忘记删除的旧代码。 谢谢你的回答,非常感谢。 –

+0

@AndrewRaappana欢迎您..... –

+1

复制/粘贴... http://stackoverflow.com/questions/4013725/converting-a-canvas-into-bitmap-image-in-android – AlexAndro

0
public class CanvasToBitmap extends View { 

    Paint paint = new Paint(); 
    Rect mRect = new Rect(); 
    Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888); 

    public myCanvas(Context context) { 
     super(context); 
     Canvas canvas = new Canvas(bitmap); 
     draw(canvas); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     mRect.set(0, 0, 200, 200); 
     paint.setColor(Color.GREEN); 
     paint.setStyle(Paint.Style.FILL); 
     canvas.drawRect(mRect, paint); 
     canvas.setBitmap(bitmap); 

     ByteArrayOutputStream mByteArrayOutputStream = new ByteArrayOutputStream(); 
     try{ 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, mByteArrayOutputStream); 

      bitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(mByteArrayOutputStream.toByteArray())); 
      mByteArrayOutputStream.flush(); 
      mByteArrayOutputStream.close(); 
     } catch (Exception e) {e.printStackTrace();} 
    } 
} 

创建一个新的实例:

CanvasToBitmap canvasToBitmap = new CanvasToBitmap(getBaseContext()); 

获取canvasToBitmap的位图:

Bitmap bitmap = canvasToBitmap.bitmap; 
+0

大小图像200x200 – amiron