2016-06-18 2 views
0

Теперь я использую canvas.drawPath (Path path, Paint paint), чтобы нарисовать путь , который создается пользователем с указанной краской. И перед закрытием этого приложения (например, приложение PhotoShop), я хочу сохранить этот путь и краску . В следующий раз. Таким образом, пользователь может начать с своего прежнего холста (экран) на своем .Как сохранить путь в json

Некоторые сказали, что они должны быть преобразованы в bytearray [] и использовать FileOutputStream, чтобы записать его в файл. Но я не знаю, как это сделать.

Пожалуйста, помогите мне. Мне действительно нужен ваш совет. Большое спасибо.

---------------------- divide 2016 6 22 18:06:13 --------------- --------

/.../ 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (event.getPressure() < 1) { /* 只能笔画 */ 
     if (!isShowing()&&touchable) { 
      float x = event.getX(); 
      float y = event.getY(); 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        LogUtils.d("Paint ACTION_DOWN"); 
        Touch_Down(x, y); 
        invalidate(); 
        break; 

       case MotionEvent.ACTION_MOVE: 
        LogUtils.d("Paint ACTION_MOVE"); 
        Touch_Move(x, y); 
        invalidate(); 
        break; 

       case MotionEvent.ACTION_UP: 
        LogUtils.d("Paint ACTION_UP"); 
        if (IsPaint) { 
         Touch_Up(mPaint); 
        } else { 
         Touch_Up(mErase); 
        } 
        invalidate(); 
        break; 
      } 
     } 
     return true; 
    } else { 
     return super.onTouchEvent(event); 
    } 
} 

private void Touch_Down(float x, float y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
    if (IsRecordPath && listener != null) { 
     listener.addNodeToPath(x, y, MotionEvent.ACTION_DOWN, IsPaint); 
    } 
} 


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; 
     if (IsRecordPath && listener != null) { 
      listener.addNodeToPath(x, y, MotionEvent.ACTION_MOVE, IsPaint); 
     } 
    } 
} 

private void Touch_Up(Paint paint) { 
    mPath.lineTo(mX, mY); 
    mCanvas.drawPath(mPath, paint); 
    mPath.reset(); 
    if (IsRecordPath && listener != null) { 
     listener.addNodeToPath(mX, mY, MotionEvent.ACTION_UP, IsPaint); 
    } 
} 

public void preview(ArrayList<Node> arrayList) { 
    touchable = true; 
    IsRecordPath = false; 
    PreviewThread previewThread = new PreviewThread(this, arrayList); 
    Thread thread = new Thread(previewThread); 
    thread.start(); 
} 

private Handler handler = new Handler() { 

    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case INDIVIDE: 
       ((View) msg.obj).invalidate(); 
       break; 
      case CHOOSEPATH: 
       JsonToPathNode(msg.obj.toString()); 
       break; 
     } 
     super.handleMessage(msg); 
    } 

}; 

class PreviewThread implements Runnable { 
    private long   time; 
    private ArrayList<Node> nodes; 
    private View   view; 

    public PreviewThread(View view, ArrayList<Node> arrayList) { 
     this.view = view; 
     this.nodes = arrayList; 
    } 

    public void run() { 
     time = 0; 
     IsShowing = true; 
     clean(); 
     if (mBitmapInit != null) { 
      drawBitmapToCanvas(mBitmapInit); 
     } 
     if (nodes!=null) { 
      for (int i = 0; i < nodes.size(); i++) { 
       Node node = nodes.get(i); 
       float x = dip2px(node.x); 
       float y = dip2px(node.y); 
      /*Log.e("pre" + x, "pre" + y); 
      if (i < nodes.size() - 1) { 
       time = nodes.get(i + 1).time - node.time; 
      }*/ 
       IsPaint = node.IsPaint; 
       if (node.IsPaint) { 
        //UserInfo.PaintColor = node.PenColor; 
        //UserInfo.PaintWidth = node.PenWidth; 
        initPaint(2); 
        //Init_Paint(node.PenColor, node.PenWidth); 
       } else { 
        //UserInfo.EraserWidth = node.EraserWidth; 
        initErase(); 
        //Init_Eraser(node.EraserWidth); 
       } 
       switch (node.TouchEvent) { 
        case MotionEvent.ACTION_DOWN: 
         Touch_Down(x, y); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         Touch_Move(x, y); 
         break; 
        case MotionEvent.ACTION_UP: 
         if (node.IsPaint) { 
          Touch_Up(mPaint); 
         } else { 
          Touch_Up(mErase); 
         } 
         break; 
       } 
       Message msg = new Message(); 
       msg.obj = view; 
       msg.what = INDIVIDE; 
       handler.sendMessage(msg); 
       if (!ReDoOrUnDoFlag) { 
        try { 
         //Thread.sleep(time); 
         Thread.sleep(0); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     ReDoOrUnDoFlag = false; 
     IsShowing = false; 
     IsRecordPath = true; 
    } 
} 

/.../

+0

если вы не хотите, чтобы сэкономить 'Bitmap' а скорее' 'Path' и объекты Paint' единственным способом косвенно использовать' android.graphics.Picture' – pskink

+0

I «Не хочу сохранять изображение, потому что изображение статично и не может быть изменено, поэтому я действительно хочу сохранить Путь или Краску, которые я могу использовать в следующий раз. – ethan

+0

ну, плохие новости, вы не можете – pskink

ответ

Смежные вопросы