import java.io.OutputStream;
import java.util.Stack;
import jin.oh.academy.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class BestPaintBoard extends View {
 ImageView imageview1;
 Bitmap bm = null;
 String d_Qfile = "NODATA"; 
 /**
  * Undo data
  */
 Stack undos = new Stack();
 /**
  * Maximum Undos
  */
 public static int maxUndos = 10;
 /**
  * Changed flag
  */
 public boolean changed = false; 
 
 /**
  * Canvas instance
  */
 Canvas mCanvas;
 ImageView imageview;
 
 /**
  * Bitmap for double buffering
  */
 Bitmap mBitmap;
 
 /**
  * Paint instance
  */
 final Paint mPaint;
 
 /**
  * X coordinate
  */
 float lastX;
 
 /**
  * Y coordinate
  */
 float lastY;
 //최대치
 public int FILL_PARENT = getWidth()|getHeight();
 
    private final Path mPath = new Path();
    private float mCurveEndX;
    private float mCurveEndY;
    private int mInvalidateExtraBorder = 10;
    
    static final float TOUCH_TOLERANCE = 8;
    private static final boolean RENDERING_ANTIALIAS = true;
    private static final boolean DITHER_FLAG = true;
    private int mCertainColor = 0xFF000000;
    private float mStrokeWidth = 2.0f;
 private String imagFilePath;
 /**
  * Initialize paint object and coordinates
  * 
  * @param c
  */
 public BestPaintBoard(Context context, String filePath) {
  super(context);
  
  // create a new paint object
  mPaint = new Paint();
  mPaint.setAntiAlias(RENDERING_ANTIALIAS);
  mPaint.setColor(mCertainColor);
  mPaint.setStyle(Paint.Style.STROKE);
  mPaint.setStrokeJoin(Paint.Join.ROUND);
  mPaint.setStrokeCap(Paint.Cap.ROUND);
  mPaint.setStrokeWidth(mStrokeWidth);
  mPaint.setDither(DITHER_FLAG);
  
  lastX = -1;
  lastY = -1;
  imagFilePath = filePath;
  Log.i("GoodPaintBoard", "initialized.");
  
 }
 /**
  * Clear undo
  */
 public void clearUndo()
 {
  while(true) {
   Bitmap prev = (Bitmap)undos.pop();
   if (prev == null) return;
   
   prev.recycle();
  }
 } 
 
 /**
  * Save undo
  */
 public void saveUndo()
 {
  if (mBitmap == null) return;
  
  while (undos.size() >= maxUndos){
   Bitmap i = (Bitmap)undos.get(undos.size()-1);
   i.recycle();
   undos.remove(i);
  }
  
  Bitmap img = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas();
  canvas.setBitmap(img);
  canvas.drawBitmap(mBitmap, 0, 0, mPaint);
  
  undos.push(img);
  
  Log.i("GoodPaintBoard", "saveUndo() called.");
 }
 
 /**
  * Undo
  */
 public void undo()
 {
  Bitmap prev = null;
  try {
   prev = (Bitmap)undos.pop();
  } catch(Exception ex) {
   Log.e("GoodPaintBoard", "Exception : " + ex.getMessage());
  }
  
  if (prev != null){
   drawBackground(mCanvas);
   mCanvas.drawBitmap(prev, 0, 0, mPaint);
   invalidate();
   
   prev.recycle();
  }
  
  Log.i("GoodPaintBoard", "undo() called.");
 } 
 
 
 
 /**
  * Paint background
  * 
  * @param g
  * @param w
  * @param h
  */
 Drawable drawable = getResources().getDrawable(R.drawable.book);
 public void drawBackground(Canvas canvas)
 {
  //Intent data = (Intent) getParent();
  //d_Qfile = data.getStringExtra(MakeActivity.FILE_PATH);
//  d_Qfile = imagFilePath;
//  Log.d("AA", d_Qfile);
//  if(d_Qfile.equals("NODATA") || d_Qfile.equals("")){
//   imageview1.setBackgroundResource(R.drawable.notemakepica);
//  }else{
//   imageview1.setImageBitmap(makeBitmap(imagFilePath));
//
//  }
  
//  drawable.setBounds(0,0, getWidth(), getHeight());
  if (canvas != null) {
//   canvas.drawColor(Color.WHITE);
   drawable.draw(canvas);
   Log.e("",""+getWidth()+","+getHeight());
  
  }
 } 
// private Bitmap makeBitmap(String url) {
//  
//  BitmapFactory.Options opt = new BitmapFactory.Options();
//  opt.inSampleSize = 4;
//  bm = BitmapFactory.decodeFile(url, opt);     
//
// return bm;
//}
 /**
  * Update paint properties
  * 
  * @param canvas
  */
 public void updatePaintProperty(int color, int size)
 {
  mPaint.setColor(color);
  mPaint.setStrokeWidth(size);
 } 
 
 /**
  * Create a new image
  */
 public void newImage(int width, int height)
 {
  Bitmap img = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas();
  canvas.setBitmap(img);
  
  mBitmap = img;
  mCanvas = canvas;
  drawBackground(mCanvas);
  
  changed = false;
  invalidate();
 } 
 
 /**
  * Set image
  * 
  * @param newImage
  */
 public void setImage(Bitmap newImage)
 {
  changed = false;
  
  setImageSize(newImage.getWidth(),newImage.getHeight(),newImage);
  invalidate();
 } 
 
 /**
  * Set image size
  * 
  * @param width
  * @param height
  * @param newImage
  */
 public void setImageSize(int width, int height, Bitmap newImage)
 {
  if (mBitmap != null){
   if (width < mBitmap.getWidth()) width = mBitmap.getWidth();
   if (height < mBitmap.getHeight()) height = mBitmap.getHeight();
  }
  
  if (width < 1 || height < 1) return;
  
  Bitmap img = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas();
  drawBackground(canvas);
  
  if (newImage != null) {
   canvas.setBitmap(newImage);
  }
  
  if (mBitmap != null) {
   mBitmap.recycle();
   mCanvas.restore();
  }
  mBitmap = img;
  mCanvas = canvas;
  
  clearUndo();
 }
 
 
 
 /**
  * onSizeChanged
  */
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  if (w > 0 && h > 0) {
   newImage(w, h);
  }
 }
 /**
  * Draw the bitmap
  */
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  
  if (mBitmap != null) {
   canvas.drawBitmap(mBitmap, 0, 0, null);
  }
 }
 /**
  * Handles touch event, UP, DOWN and MOVE
  */
 public boolean onTouchEvent(MotionEvent event) {
  int action = event.getAction();
  switch (action) {
   case MotionEvent.ACTION_UP:
    changed = true;
    
    Rect rect = touchUp(event, false);
    if (rect != null) {
                    invalidate(rect);
                }
          mPath.rewind();
          
                return true;
                
   case MotionEvent.ACTION_DOWN:
    saveUndo();
    
    rect = touchDown(event);
    if (rect != null) {
                    invalidate(rect);
                }
                
    return true;
                
   case MotionEvent.ACTION_MOVE:
    rect = touchMove(event);
                if (rect != null) {
                    invalidate(rect);
                }
                return true;
  }
  return false;
 }
 /**
  * Process event for touch down
  * 
  * @param event
  * @return
  */
    private Rect touchDown(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        lastX = x;
        lastY = y;
        Rect mInvalidRect = new Rect();
        mPath.moveTo(x, y);
        final int border = mInvalidateExtraBorder;
        mInvalidRect.set((int) x - border, (int) y - border, (int) x + border, (int) y + border);
        mCurveEndX = x;
        mCurveEndY = y;
        mCanvas.drawPath(mPath, mPaint);
        
        return mInvalidRect;
    }
 
    
    /**
     * Process event for touch move
     * 
     * @param event
     * @return
     */
    private Rect touchMove(MotionEvent event) {
        Rect rect = processMove(event);
        
        return rect;
    } 
    private Rect touchUp(MotionEvent event, boolean cancel) {
     Rect rect = processMove(event);
        return rect;
    }
    /**
     * Process Move Coordinates
     * 
     * @param x
     * @param y
     * @param dx
     * @param dy
     * @return
     */
    private Rect processMove(MotionEvent event) {
     final float x = event.getX();
        final float y = event.getY();
        final float dx = Math.abs(x - lastX);
        final float dy = Math.abs(y - lastY);
        Rect mInvalidRect = new Rect();
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            final int border = mInvalidateExtraBorder;
            mInvalidRect.set((int) mCurveEndX - border, (int) mCurveEndY - border,
                    (int) mCurveEndX + border, (int) mCurveEndY + border);
            float cX = mCurveEndX = (x + lastX) / 2;
            float cY = mCurveEndY = (y + lastY) / 2;
            mPath.quadTo(lastX, lastY, cX, cY);
            // union with the control point of the new curve
            mInvalidRect.union((int) lastX - border, (int) lastY - border,
                    (int) lastX + border, (int) lastY + border);
            // union with the end point of the new curve
            mInvalidRect.union((int) cX - border, (int) cY - border,
                    (int) cX + border, (int) cY + border);
            lastX = x;
            lastY = y;
            mCanvas.drawPath(mPath, mPaint);
        }
        return mInvalidRect;
    }
 
 /**
  * Save this contents into a Jpeg image
  * 
  * @param outstream
  * @return
  */
 public boolean Save(OutputStream outstream) {
  try {
   mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
   invalidate();
   
   return true;
  } catch (Exception e) {
   return false;
  }
 }
 
 
}

소스코드입니다..

 

  Drawable drawable = getResources().getDrawable(R.drawable.book);
 public void drawBackground(Canvas canvas)
 {
  //Intent data = (Intent) getParent();
  //d_Qfile = data.getStringExtra(MakeActivity.FILE_PATH);
//  d_Qfile = imagFilePath;
//  Log.d("AA", d_Qfile);
//  if(d_Qfile.equals("NODATA") || d_Qfile.equals("")){
//   imageview1.setBackgroundResource(R.drawable.notemakepica);
//  }else{
//   imageview1.setImageBitmap(makeBitmap(imagFilePath));
//
//  }
  
//  drawable.setBounds(0,0, getWidth(), getHeight());
  if (canvas != null) {
//   canvas.drawColor(Color.WHITE);
   drawable.draw(canvas);
   Log.e("",""+getWidth()+","+getHeight());
  
  }
 } 
// private Bitmap makeBitmap(String url) {
//  
//  BitmapFactory.Options opt = new BitmapFactory.Options();
//  opt.inSampleSize = 4;
//  bm = BitmapFactory.decodeFile(url, opt);     
//
// return bm;
//}

 

이부분에서

 


imagFilePath 이부분이 카메라를찍고 저장을하면 그 주소값이 들어있는 스트링값입니다.

그리고 지금 보시는 부분이 캔버스에서 백그라운드를 정해주는 부분인대


백그라운드에 저 저장한 주소값이 들어있는 스트링값을 출력하기위해선 무엇을사용해야할지 전혀 감이안잡히네요 ㅠㅠ