2012-02-26 74 views
1

所以我得到了一個畫布和佈局。 在畫布上繪製顏色,而在佈局中繪製背景圖像。 在畫布上繪畫後,我想保存與佈局背景一起繪製的圖像。任何人都可以幫助我怎麼可能做到這一點? 此外,當我保存畫布時,它只保存黑色圖像。我怎樣才能保存圖像從畫布和佈局在Android 2.2

public class paint extends Activity implements OnTouchListener{ 

DrawPanel dp; 
private ArrayList<Path> pointsToDraw = new ArrayList<Path>(); 
private Paint mPaint; 
Path path; 
protected Button cancel; 
protected Button save; 
protected FrameLayout fl; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    dp = new DrawPanel(this); 
    dp.setOnTouchListener(this); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    mPaint = new Paint(); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.WHITE); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.MITER); 
    mPaint.setStrokeCap(Paint.Cap.BUTT); 
    mPaint.setStrokeWidth(5); 

    fl = new FrameLayout(this); 
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 
      WindowManager.LayoutParams.TYPE_APPLICATION, 
      WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
      PixelFormat.TRANSPARENT); 
    fl.addView(dp,370,370); 
    this.getWindowManager().addView(fl , lp); 
    setContentView(R.layout.boy_crown); 


    Button save = new Button(this); 
    FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    params2.topMargin = 375; 
    params2.gravity =0; 
    params2.rightMargin = 160; 
    params2.gravity =0; 
    save.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); 
    save.setPadding(0,0, 130, 60); 
    fl.addView(save, params2); 
    save.setOnClickListener(new ButtonClickHandler2()); 

} 

public class ButtonClickHandler2 implements View.OnClickListener { 
    public void onClick(View view) { 

     dp.setDrawingCacheEnabled(true); 
     Bitmap bm = dp.getDrawingCache(); 
     try { 
      String path = Environment.getExternalStorageDirectory().toString(); 
      File imgDirectory = new File("/sdcard/BillysCrown"); 
      imgDirectory.mkdirs(); 
      OutputStream fOut = null; 
      File file = null; 
      String fileid = System.currentTimeMillis() + ""; 
      file = new File(path, "/BillysCrown/" + fileid + ".png"); 
      Toast.makeText(paint.this, "saved at: " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); 
      fOut = new FileOutputStream(file); 
      bm.compress(Bitmap.CompressFormat.PNG, 100, fOut); 
      fOut.flush(); 
      fOut.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    dp.pause(); 
} 



@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    dp.resume(); 
} 



public class DrawPanel extends SurfaceView implements Runnable{ 

    Thread t = null; 
    SurfaceHolder holder; 
    boolean isItOk = false ; 


    public DrawPanel(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
     holder = getHolder(); 

    } 

    @Override 
    public void run() { 

     // TODO Auto-generated method stub 
     while(isItOk == true){ 

      if(!holder.getSurface().isValid()){ 
       continue; 
      } 
      holder.setFormat(PixelFormat.TRANSPARENT); 
      Canvas c = holder.lockCanvas(); 
      onDraw(c); 
      holder.unlockCanvasAndPost(c); 

     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 
        synchronized(pointsToDraw) 
     { 
     for (Path path : pointsToDraw) 
     { 
      canvas.drawPath(path, mPaint); 
     } 
     } 
    } 

    public void pause(){ 
     isItOk = false; 
     while(true){ 
      try{ 
       t.join(); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
      break; 
     } 
     t = null; 
    } 

    public void resume(){ 
     isItOk = true; 
     t = new Thread(this); 
     t.start(); 

    } 


} 


@Override 
public boolean onTouch(View v, MotionEvent me) { 
    // TODO Auto-generated method stub 
      synchronized(pointsToDraw) 
      { 
    if(me.getAction() == MotionEvent.ACTION_DOWN){ 
     path = new Path(); 
     path.moveTo(me.getX(), me.getY()); 
     //path.lineTo(me.getX(), me.getY()); 
     pointsToDraw.add(path); 
    }else if(me.getAction() == MotionEvent.ACTION_MOVE){ 
     path.lineTo(me.getX(), me.getY()); 
    }else if(me.getAction() == MotionEvent.ACTION_UP){ 
     //path.lineTo(me.getX(), me.getY()); 
    } 
    }  
    return true; 

} 

}

回答

0

我已經寫how you can save a screenshot from a SurfaceView的教程。

它基本上是在Android的每個View相同。只要確保你已經閱讀,直到最後一段:

這也應該與其他意見。在 一般性觀點的唯一的問題是,你需要確保它們完全膨脹,所以 你不能同時在OnCreate是() 方法創建視圖的屏幕截圖。當視圖完全膨脹時,您應該使用ViewTreeObserver獲取回調 。

+0

哇!這真的很完美!非常感謝你 :) – 2012-02-27 01:56:02

相關問題