2013-10-20 28 views
2

我有一個視圖,從EditText延伸,允許用戶寫一個文本,然後用手指在同一視圖中繪製。保存一個畫布供將來使用

我想要的是保存該項目以備將來使用,我在考慮應用何時被銷燬,然後打開繪圖被刪除。我想要的是下次用戶打開應用程序時保存此圖形的方法。

對於我使用sharedPreferences文本保存中的文本,併爲繪製我不知道如何可以保存。

我認爲將繪圖保存爲圖像文件不是保存它的方法,但我不知道。

編輯:

我試圖保存位圖作爲JPEG再畫到畫布上。但它不起作用,最終,它顯示的顏色爲黑色,不允許我繪製。

我的代碼如下,最後寫了我創建的兩個方法,但它們不能很好地工作。他們是saveBitmap()openBitmap()

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 

import android.content.Context; 
import android.graphics.*; 
import android.os.Environment; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.EditText; 

public class DrawEditText extends EditText { 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 
    private Paint mPaint; 
    private MaskFilter mEmboss; 
    private MaskFilter mBlur; 
    private int brush;   
    private Boolean drawing; 
    private int maxLines; 

    public DrawEditText(Context c) { 
     super(c); 


     //This initializes all the objects 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     mBitmapPaint.setColor(Color.TRANSPARENT); 

     mPaint = new Paint(); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(5); 
     mPaint.setAntiAlias(true); 

     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
       0.4f, 6, 3.5f); 

     mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 

     drawing = false; 
     brush = -1; 
     maxLines = 20; 
    } 
    public DrawEditText(Context c, AttributeSet attrs) { 
     super(c, attrs); 

     //This initializes all the objects 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

     mPaint = new Paint(); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(5); 
     mPaint.setAntiAlias(true); 

     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
       0.4f, 6, 3.5f); 

     mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 

     drawing = false; 
     brush = -1; 
     maxLines = 20; 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
     super.onDraw(canvas); 
    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     //This conditional makes that if not it's drawing no points are saved and no points are drawed 
     if (drawing){ 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        touch_start(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        touch_move(x, y); 
        invalidate(); 
        break; 
       case MotionEvent.ACTION_UP: 
        touch_up(); 
        invalidate(); 
        break; 
      } 
      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 

    public void changePaint(int stroke, int color){ 
     mPaint.setColor(color); 
     mPaint.setStrokeWidth(stroke); 
    } 
    public void clear(){ 
     mCanvas.drawColor(0x00AAAAAA); 
     mCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
     setText(""); 
    } 
    public void changeBrush(int id){ 
     //String[] ids={"emboss", "blur", "another"}; 
     switch (id) { 
     case 0: 
      mPaint.setMaskFilter(mEmboss); 
      brush = 0; 
      break; 
     case 1: 
      mPaint.setMaskFilter(mBlur); 
      brush = 1; 
      break; 
     case 2: 
      mPaint.setMaskFilter(null); 
      brush = -1; 
      break; 
     default: 
      mPaint.setMaskFilter(null); 
      brush = -1; 
      break; 
     } 
    } 
    public int getBrush(){ 
     //String[] ids={"emboss", "blur", "another"}; 
     return brush; 
    } 
    public void eraser(){ 
     mPaint.setMaskFilter(null); 
     mPaint.setColor(0x00AAAAAA); 
    } 

    public void setDrawing(Boolean drawing){ 
     this.drawing = drawing; 
    } 

    public Boolean isDrawing(){ 
     return drawing; 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 

     TextWatcher watcher = new TextWatcher() { 

      private String text; 
      private int beforeCursorPosition = 0; 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       text = s.toString(); 
       beforeCursorPosition = start; 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

       /* turning off listener */ 
       removeTextChangedListener(this); 

       /* handling lines limit exceed */ 
       if (DrawEditText.this.getLineCount() > maxLines) { 
        DrawEditText.this.setText(text); 
        DrawEditText.this.setSelection(beforeCursorPosition); 
       } 

       /* turning on listener */ 
       addTextChangedListener(this); 

      } 
     }; 

     this.addTextChangedListener(watcher); 
    } 

    @Override 
    public int getMaxLines() { 
     return maxLines; 
    } 

    @Override 
    public void setMaxLines(int maxLines) { 
     this.maxLines = maxLines; 
    } 

    public void saveBitmap(){ 
     mCanvas.setBitmap(mBitmap); 
     File sd = Environment.getExternalStorageDirectory(); 
     File myDir = new File(sd + "/tweeet");  
     myDir.mkdirs(); 
     File f = new File(myDir, ".drawing.jpeg"); 
     try { 
      if (myDir.canWrite()) { 
       f.createNewFile(); 
       OutputStream os = new FileOutputStream(f); 
       mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); 
       os.close(); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    public void openBitmap(){ 
     File sd = Environment.getExternalStorageDirectory(); 
     File myDir = new File(sd + "/tweeet");  
     myDir.mkdirs(); 
     File f = new File(myDir, ".drawing.jpeg"); 
     mBitmap = BitmapFactory.decodeFile(f.getPath()); 
    } 
} 

回答

2
  1. 從畫布圖像保存到文件。 Here is how to do it.
  2. onResume()加載圖像文件並在畫布上繪製。
+0

如何做到這一點? –

1

您可以將畫布保存爲位圖。試試這個:

1.創建使用Bitmap.createBitmap()
2.設置畫布指向位圖
3.Draw畫布
4.使用位圖

Bitmap bitmap = Bitmap.createBitmap(width, height. Config.RGB_565)); 
canvas.setBitmap(bitmap); 
... 
正確尺寸的位圖

然後將位圖保存爲一個文件,您可以稍後在需要時加載它。

+0

然後我將位圖保存到一個文件中,或者我可以保存爲一個對象? –

+1

@GabrielEsteban最簡單的就是將它保存爲一個文件。 – Caner

1

「然後,我將位圖保存到一個文件或者我可以保存在作爲一個對象?」
- 你應該保存位圖到一個圖像文件,如* .png格式