2016-06-18 5 views
0

이제 패스를 그리기 위해 canvas.drawPath (패스 경로, 페인트 페인트)를 사용하여 지정된 페인트로 사용자가 만든 경로를 그립니다. 그리고이 앱을 종료하기 전에 (PhotoShop 앱과 같은)이 경로 및 그림을 저장하고 싶습니다. 다음 번에. 따라서 사용자는 이전 캔버스 (화면)의 에서 시작할 수 있습니다.json에서 패스를 저장하는 방법

일부 사람들은 bytearray []로 변환하고 FileOutputStream을 사용하여 파일에 기록해야한다고 말합니다. 하지만 그 방법을 모르겠습니다.

제발 도와주세요. 나는 너의 충고를 정말로 필요로한다. 정말 고마워요.

---------------------- 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

답변

관련 문제