이제 패스를 그리기 위해 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;
}
}
/.../
당신은'Bitmap' 것이 아니라'Path' 및 저장하려는 해달라고하면 는'Paint'는 유일한 방법은 사용하는 간접적 인 오브젝트했다'android.graphics.Picture' – pskink
I 그림에 저장하고 싶지 않습니다. 그림이 정적이어서 수정할 수 없으므로 다음 번에 사용할 수있는 경로 또는 그림판을 저장하고 싶습니다. – ethan
글쎄, 나쁜 소식은, 당신은 할 수 없다 – pskink